2010-11-30 5 views
6

これは私にとって困惑であり、私はそれを解決できないと本当に迷惑です!だから、誰かが自由な時間を持っているなら、私はここでそれを解決する方法の提案をしたいと思います!この文字列はBase64ですか?どのようにエンコーディングが使用されているのかわかりますか?

パスワードをOracleデータベースに格納するソフトウェアを使用します。パスワードフィールドのタイプはVarchar2(100文字)です。ソフトウェアはパスワードをエンコードし、エンコードされた文字列をデータベースに格納するようです。

パスワードは「1234」、エンコードされた文字列は「cRDtpNCeBiql5KOQsKVyrA0sAiA =」です。データベース内のすべてのパスワードは28文字です。

私が自分自身に割り当てたパズルは、文字列のエンコードや暗号化を見つけることです。私の最初のチェックは、だからここにBase64で

にあったのpythonでの私の最初のテスト(アイドル)である:ここでは

>>> import base64 
>>> encoded = 'cRDtpNCeBiql5KOQsKVyrA0sAiA=' 
>>> decoded = base64.b64decode(encoded) 
>>> decoded 
'q\x10\xed\xa4\xd0\x9e\x06*\xa5\xe4\xa3\x90\xb0\xa5r\xac\r,\x02 ' 
>>> print decoded 
qíᄂО*ᆬ䣐ᄚᆬrᆲ 

は私の第二の試験である:だから

>>> myString = '1234' 
>>> encoded = base64.b64encode(myString) 
>>> encoded 
'MTIzNA==' 
>>> decoded = base64.b64decode('MTIzNA==') 
>>> decoded 
'1234' 

、私の最初に考えたのは、これがBase64でエンコードされていないということです。 wikipedia(https://en.wikipedia.org/wiki/Base64)を確認した後、Base64でエンコードされた文字列は固定サイズではないようです。 2番目の考えは、文字列が暗号化されてBase64にエンコードされていることです。そのため、私は奇妙に見えるデコードされた文字列を取得します。

アイデア?

+0

これは 'len(base64.b16encode(base64.b64decode( 'cRDtpNCeBiql5KOQsKVyrA0sAiA =')))' 'が' 40'でsha1ハッシュのbase64エンコードである可能性がありますか? –

+0

すべての制約(最小長、最大長、アルファ、大文字、数字、特殊文字など)を知っているので、SHA1ハッシュをパスワードに解読することは難しいでしょうか(OK、それは本当に解読されません)...たぶん私は別の質問をする必要があります! :) –

+0

ダンなぜ私はあなたが説明することができますb16encodeを使用して理解していない? –

答えて

13

実際にはBase64でエンコードされています。ただし、暗号化されたパスワード自体ではなく、そのSHA-1ハッシュです。

from sha import sha 
print 'cRDtpNCeBiql5KOQsKVyrA0sAiA='.decode('base64').encode('hex') 
print sha('1234').hexdigest() 

やPythonの新しいバージョンの:

from hashlib import sha1 
print 'cRDtpNCeBiql5KOQsKVyrA0sAiA='.decode('base64').encode('hex') 
print sha1('1234').hexdigest() 

Base64では4つの文字として3つのバイトを符号化します。パディングが1つで27文字あるので、20バイトの符号化バイト(27*3/4)があることがわかります。セキュリティに関連するものが20バイト(または160ビット)の長さである場合、通常はSHA-1です。 16バイト(128ビット)のとき、それは通常MD5です。

ところで、常にランダムな塩をミックスに追加して、2つの同一のパスワードがデータベースに突き出ないようにすることをお勧めします。 Linuxでは、cryptモジュールがそれを手助けし、セキュリティ対策をいくつか追加しました。

:「暗号化された」パスワードから元のものを得るのはとても簡単です。Rainbow Tablesと呼ばれる数年前に有名なテクニックがあります。そこにはonline versionsもあります。あなたのハッシュを16進数で入力すると(7110eda4d09e062aa5e4a390b0a572ac0d2c0220)、1秒で1234が得られます。

+2

どのような安全でないソフトウェアが何らかの塩なしでパスワードを保存するのはなぜですか? –

+0

'import hashlib'がより適切でしょう(' idle'は 'sha'が非難されていると文句を言う)。それ以外の答えはかなり良いです、ありがとう! –

+0

Matthew、システムは塩を使わずにパスワードを保存し、システムはLinux上で動作します。 –

5

len(decoded) = 20これはBase64でエンコードされたSHA1ハッシュだと思います。

次の方法で、このようなコード化されたパスワードを作成することができますように保存するパスワードについては

import hashlib 
import base64 
passwd = '1234' 
hp = base64.b64encode(hashlib.sha1(passwd).digest()) 
print hp 
print len(hp) 

:多くのクラッカーが事前に計算MD5、SHA1および他のハッシュと「虹」のテーブルを使用することができ、彼らができますが、それは非常に良いではありませんそのようなハッシュに基づいてパスワードを取得します。それを防ぐには、塩を使用する必要があります:hash(salt+passwd)、そのような塩は、ユーザーごとにデータベースに保存されたランダムな文字列、またはユーザーのログイン(決して変更できないもの)です。

+1

MD5は長さ16バイトなので、20だからsha1 –

+0

もちろん、ありがとう、 –

+0

Michal、あなたの答えも正しいです。ご協力いただきありがとうございます! –

関連する問題