2012-02-03 121 views
0

對於我的assingment,我應該創建一個預先計算的哈希值從給定字典與鹽0到255到每個密碼的文件。我有散列,但是當我嘗試將它們與給定的影子文件進行比較時,我什麼都沒有。這導致我相信我可能哈希不正確?我的教授確實說過密碼哈希是用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 

編輯:用我被賦予了陰影RAR文件:http://mediafire.com/?euwjpxr3np36brt

字典文件中給出 - http://mediafire.com/?psspoqo900x0hmq

+2

關閉文件通常是一個好主意。 – 2012-02-03 22:16:09

+1

請確保你的標籤在你的代碼中是正確的 - 畢竟這是Python :) – 2012-02-03 22:25:28

回答

1

編輯:

明白了,我想。看看你的crack()函數。你打開散列文件,然後for line in f你去掉這條線,然後把這條線拆分成line1,把你的散列文件散列出來。然後,您將完整的line而不是line1與您想要破解的散列進行比較。當然,整行包含的不僅僅是哈希,因此它不能匹配。爲了清楚起見,您可以將line1重命名爲generated_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中,這是一個鍵/值字典。我們將哈希用作關鍵字,將明文用作快速匹配哈希值的值。如果你想知道散列表中是否有特定的散列,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中找到了一個匹配項。 6expression。我非常接近。你爲什麼認爲其他人都不匹配?也許我的教授錯誤地創建了這些散列文件?這是我所能想到的。再次感謝您的幫助。作爲這項任務的結果,我的Python技能正在大大提高! – Justin 2012-02-04 23:57:43

+0

聽起來像你現在正在工作。這可能是因爲你的教授並不希望你能夠解密所有這些密碼,並且可以爲其他人提供明文,作爲不會被非常快的字典攻擊所破壞的更強密碼的例子。對於這項任務,我預料會有更多的比賽。你可以很好地問他/聽聽你預計會有多少「密碼」被破壞。 – gfortune 2012-02-05 00:37:48

0

我的直覺是,這不是哈希在實現之間計算的方式,而是哈希值。例如,你確定shadow文件是通過將整數字符串添加到密碼的開頭而被醃製的嗎?你確定密碼應該是strip()'d?