MD5加密困境

时间:2013-07-22 19:15:30

标签: python encryption md5

我用Python编写了一个加密程序,我的一个选择是md5加密。当我通过我的md5加密运行一个已知的字符串时,我会收到一个不同的哈希值,然后如果我通过md5加密网站运行EXACT相同的字符串,或者为firefox运行cryptofox。

例如。我的程序哈希输出 - fe9c25d61e56054ea87703e30c672d91 - 明文:g4m3

例如。在线哈希/ cryptofox - 26e4477a0fa9cb24675379331dba9c84 - 明文:g4m3

完全相同的单词,2个不同的哈希值。 现在是我的代码snipet:

word="g4m3"
string=md5.new(word).hexdigest()
print string

2 个答案:

答案 0 :(得分:3)

关于你的问题:哈希非常敏感。即使是单个差异字符也可能导致完全不同的输出字符串。情况可能是在线实现附加了空白字符,或者更可能是新行。这个额外的字符将改变算法的输出。 (也可能发生相反的情况:你正在追加换行而在线换行却不是这样)

关于MD5“加密”: MD5是 NOT 加密。它是哈希。加密接收数据和密钥,并吐出随机数据。这些数据是可以恢复的。另一方面,散列接收数据并吐出有限数量的数据,这些数据代表原始数据。但是,除非存储在别处,否则原始数据将丢失。

更多信息供参考: 另一个有趣的区别是各种类型的算法吐出的数据。加密可以接收任何数量的数据(当然,在OS /软件的范围内),并将输出一堆数据appx。大小与输入数据相等。然而,哈希不会。由于它仅仅是数据的表示,因此输出有限。这可能会带来问题。例如,如果您拥有无限量的数据,最终两个完全不同的数据将具有相同的哈希值。出于这个原因,当使用散列来比较两个不同的值时,通常也可以比较两个单独的散列。具有两个等同哈希值的两个独立数据的统计概率是天文数据低。

当然,你会进入使用加密方法的哈希算法,但我不会在这里讨论。

答案 1 :(得分:3)

您在MD5输入字符串中添加了换行符:

>>> import md5
>>> word="g4m3"
>>> md5.new(word).hexdigest()        # no newline
'26e4477a0fa9cb24675379331dba9c84'
>>> md5.new(word + '\n').hexdigest() # with a newline
'fe9c25d61e56054ea87703e30c672d91'

从文件中读取数据时,请确保删除行尾的换行符。您可以使用.rstrip('\n')从行尾删除行间隔字符,或使用.strip()从行的开头或结尾删除所有空格:

>>> word = 'g4m3\n'
>>> md5.new(word).hexdigest()
'fe9c25d61e56054ea87703e30c672d91'
>>> word = word.strip()
>>> md5.new(word).hexdigest()
'26e4477a0fa9cb24675379331dba9c84'