2012-02-03 5 views
0

私のおかげで、各パスワードに0〜255のsaltを持つ辞書から事前計算されたハッシュ値のファイルを作成するはずです。私はハッシュを持っていますが、与えられたシャドーファイルと比較しようとすると、何も得られません。これは私がおそらく間違ってハッシュしていると信じさせてくれるでしょうか?私の教授は、パスワードハッシュがCで行われたと言っていました。違いがありますか? ハッシュMD5のハッシングとPythonでの比較

import hashlib 

f = open('/root/dictionary/dictionary', 'r') 
print f 
i=0 
def getMD5Hash(textToHash=None): 
return hashlib.md5(textToHash).hexdigest() 

for line in f: 
    line = line.rstrip() 
    #print line 
    i=0 

    while i <= 255: 
      j=str(i) 
      line1 = j+line 
      md5=getMD5Hash(line1) 
      print md5,':',line1 
      i+=1 

見つける

f1 = open('/root/dictionary/shadow3','r') 


def crack(Hash=None): 
    f = open('/root/dictionary/HASHES','r') 

    for line in f: 
    line = line.rstrip() 
    line1 = line.split(" ")[0] 

    if line == Hash: 
     print (line,"\n",Hash) 
     return line 




for line in f1: 
    line = line.rstrip() 
    line = line.split(":")[1:] 
    print line[0] 
    result = crack(line[0]) 
    print result 

EDITを割れ:ここ

は私のコードで私が与えた影付きRAR書庫ファイル: http://mediafire.com/?euwjpxr3np36brt

辞書ファイルが指定された - http://mediafire.com/?psspoqo900x0hmq

+2

一般に、ファイルを閉じるとよいでしょう。 –

+1

あなたのコードでタブが正しいことを確認してください - これは結局のところPythonです:) –

答えて

1

EDIT:

がそれを手に入れた、私は思います。あなたのcrack()関数を見てください。ハッシュファイルを開き、次にfor line in f行を削除して、その行をline1に分割して、ハッシュファイルからハッシュを取り出します。次に、line1の代わりに完全なlineを、クラックしたいハッシュと比較します。もちろん、完全な行にはハッシュ以上のものが含まれているため、一致することはできません。わかりやすくするためline1generated_hashに変更することもできます。いくつかのトラブルシューティングを通じ

は、私たちが質問に掲示例のハッシュが無効であると判断しました:その後、あなたがif generated_hash == Hash:

その他の注意が必要であることがより明らかであろう。私はまた、シードの解法で使われたメソッドが実際には `hashlib.md5(salt + cleartext).hexdigest()であることを確認しました。ポスターは正しくハッシュを生成していますが、与えられたシャドウファイルと比較しようとすると、ある時点で失敗しています。当初、行末にはいくつかの問題がありました。

私はポスターが問題なくハッシュを生成できることを知っているので、ハッシュテーブルをディスクから毎回読み取る必要がないように、ハッシュを生成して辞書に格納する代わりの方法を投稿しています。

import hashlib 

#Initialize an empty dictionary. We'll add entries to this as we read the 
#dictionary file in 
hash_table = {} 

print('Generating hashes...') 

#Using with on the file object means that it will be closed automatically 
#when the block is finished 
with open('dictionary.txt', 'r') as inp_file: 

    for word in inp_file.readlines(): 

     #strip off the trailing whitespace ('\n' or '\n\r' depending on the platform) 
     word = word.strip() 

     #The requirement is for a salt to be prepended to the cleartext 
     #dictionary word. For each possible salt value... 
     for salt in range(0,256): 
      #convert the salt from an int to a string here so we don't have to 
      #continually do it below 
      salt = str(salt) 

      #Store the hash/cleartext pair in the dictionary. The key of the 
      #dictionary is the hash and the value is the salted cleartext 
      hash_table[hashlib.md5(salt+word).hexdigest()] = salt+word 

ブロックが終了すると、自動的にファイルを閉じます、私はwith fileobject as some_name:を使用しているかに注意してください。ハッシュは、キー/値の辞書であるhash_tableに格納されます。私たちはハッシュをキーとして使用し、平文は値をハッシュと速く一致させるための値として使用しています。特定のハッシュがhash_tableにあるかどうかを知りたければ、if 'some_hex_hash' in hash_table: do stuffが正しいアプローチです。ハッシュ値のクリアテキストを取得するには、単純にhash_table['some_hex_hash']です。辞書の詳細については、http://docs.python.org/tutorial/datastructures.html#dictionariesを参照してください。

もちろん、これはすでに作業している部分です。ここでのトリックは、シャドーハッシュを正しくロードして、ファイル内にあるかどうか(または辞書を使用している場合はhash_table)を確認することです。

+0

まあ、私はshadow3で1つのマッチを見つけました。 6式。私はとても近くにいる。なぜあなたは他の誰も一致しないと思いますか?私の教授がこれらのハッシュファイルを間違って作成したのでしょうか?それは私が考えることができるすべてです。ご協力いただきありがとうございます。私のpythonのスキルは、この課題の結果として大きく改善しています! – Justin

+0

あなたは今働いているように聞こえます。あなたの教授があなたのすべてを解読できるとは思わないかもしれないし、他の人のための平文を非常に高速な辞書攻撃によって壊れていないより強力なパスワードの例として提供するかもしれません。私はこの課題に対してもう少しマッチを期待していただろう。あなたは彼に尋ねる/あなたが壊すと予想されている "パスワード"がどれくらいあるか聞いてもらえます。 – gfortune

0

私の直感は、実装間でハッシュが計算される方法ではなく、何がハッシュされているかということです。たとえば、パスワードの先頭に整数文字列を追加して、シャドーファイルが塩漬けされていることを確認してください。あなたはパスワードがstrip()になるはずですか?

関連する問題