在python中进行MD5散列和比较

时间:2012-02-03 22:11:08

标签: python md5 hash

对于我的帮助,我应该创建一个预先计算的哈希值文件,从给定的字典中加入0到255的盐到每个密码。我有哈希,但是当我尝试将它们与给定的影子文件进行比较时,我什么也得不到。这让我相信我可能不正确哈希?我的教授确实说密码哈希是用C完成的。这有什么不同吗?

这是我的代码: 找到哈希

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 个答案:

答案 0 :(得分: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:的,当with块完成时会自动关闭文件。哈希存储在hash_table中,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中)。

答案 1 :(得分:0)

我的直觉是,它不是实现之间计算哈希的方式,而是正在进行哈希处理的方式。例如,您是否确定通过将整数字符串添加到密码的开头来保存影子文件?您确定密码应为strip()'d?