8

我有一个生成的 MD5 哈希,我想将它与字符串中的另一个 MD5 哈希进行比较。下面的陈述是错误的,即使它们在您打印时看起来相同并且应该是正确的。

hashlib.md5("foo").hexdigest() == "acbd18db4cc2f85cedef654fccc4a4d8"

谷歌告诉我我应该对结果进行编码hexdigest(),因为它不返回字符串。但是,下面的代码似乎也不起作用。

hashlib.md5("foo").hexdigest().encode("utf-8") == "foo".encode("utf-8")
4

3 回答 3

14

Python 2.7,.hexdigest() 确实返回一个 str

>>> hashlib.md5("foo").hexdigest() == "acbd18db4cc2f85cedef654fccc4a4d8"
True
>>> type(hashlib.md5("foo").hexdigest())
<type 'str'>

蟒蛇 3.1

.md5() 不采用 unicode(“foo”是),因此需要将其编码为字节流。

>>> hashlib.md5("foo").hexdigest()
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    hashlib.md5("foo").hexdigest()
TypeError: Unicode-objects must be encoded before hashing

>>> hashlib.md5("foo".encode("utf8")).hexdigest()
'acbd18db4cc2f85cedef654fccc4a4d8'

>>> hashlib.md5("foo".encode("utf8")).hexdigest() == 'acbd18db4cc2f85cedef654fccc4a4d8'
True
于 2010-08-27T10:40:49.263 回答
5

使用 == 进行哈希比较可能是一个安全漏洞。

https://groups.google.com/forum/?fromgroups=#!topic/keyczar-discuss/VXHsoJSLKhM

攻击者可能会寻找时间差异并有效地遍历密钥空间并找到将通过相等性测试的值。

于 2013-01-23T18:56:41.160 回答
2

hexdigest返回一个字符串。您的第一条语句True在 python-2.x 中返回。

在 python-3.x 中,您需要将参数编码为md5函数,在这种情况下,相等性也是True. 如果没有编码,它会引发TypeError.

于 2010-08-27T10:37:17.097 回答