我有一个生成的MD5哈希,我希望将其与字符串中的另一个MD5哈希进行比较。下面的陈述是错误的,即使它们在打印时看起来一样,应该是真的。
hashlib.md5("foo").hexdigest() == "acbd18db4cc2f85cedef654fccc4a4d8"
谷歌告诉我,我应该对hexdigest()
的结果进行编码,因为它不会返回字符串。但是,下面的代码似乎也不起作用。
hashlib.md5("foo").hexdigest().encode("utf-8") == "foo".encode("utf-8")
答案 0 :(得分:11)
Python 2.7,.hexdigest()确实返回str
>>> hashlib.md5("foo").hexdigest() == "acbd18db4cc2f85cedef654fccc4a4d8"
True
>>> type(hashlib.md5("foo").hexdigest())
<type 'str'>
Python 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
答案 1 :(得分:5)
使用==进行哈希比较可能是一个安全漏洞。
https://groups.google.com/forum/?fromgroups=#!topic/keyczar-discuss/VXHsoJSLKhM
攻击者可能会查找时序差异并有效地遍历键空间并找到一个将通过相等测试的值。
答案 2 :(得分:2)
hexdigest
returns a string。你的第一个语句在python-2.x中返回True
。
在python-3.x中,你需要将参数编码为md5
函数,在这种情况下,相等也是True
。如果没有编码,则会引发TypeError
。