将hexdigest()的结果与字符串进行比较

nip*_*p3o 6 python python-2.x string-comparison hashlib

我有一个生成的MD5哈希,我想将其与字符串中的另一个MD5哈希进行比较.下面的陈述是错误的,即使它们在打印时看起来一样,应该是真的.

hashlib.md5("foo").hexdigest() == "acbd18db4cc2f85cedef654fccc4a4d8"
Run Code Online (Sandbox Code Playgroud)

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

hashlib.md5("foo").hexdigest().encode("utf-8") == "foo".encode("utf-8")
Run Code Online (Sandbox Code Playgroud)

pyc*_*uft 12

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

>>> hashlib.md5("foo").hexdigest() == "acbd18db4cc2f85cedef654fccc4a4d8"
True
>>> type(hashlib.md5("foo").hexdigest())
<type 'str'>
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)


jwi*_*ins 5

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

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

攻击者可能会查找时序差异并有效地遍历键空间并找到将通过相等性测试的值.

  • Python 3.3添加了一个用于安全哈希比较的函数:http://docs.python.org/3/library/hmac#hmac.compare_digest (2认同)