将hexdigest()方法的结果与一个字符串进行比较

8

我有一个生成的MD5哈希值,想要将其与另一个字符串的MD5哈希值进行比较。下面的语句是错误的,尽管它们在打印时看起来相同,但应该是真实的。

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

谷歌告诉我应该对hexdigest()的结果进行编码,因为它不返回一个字符串。然而,下面的代码似乎也不能正常工作。

hashlib.md5("foo").hexdigest().encode("utf-8") == "foo".encode("utf-8")
3个回答

15

在Python 2.7中,.hexdigest()返回一个字符串

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

Python 3.1

.md5()不接受Unicode类型的参数("foo"是Unicode),因此需要将其编码为字节流。

>>> 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

你最后的代码运行得很好。不知何故,在我的AppEngine开发服务器上测试时没有错误信息。我应该在Python控制台中进行测试。我很抱歉,并会在下次这样做。 - nip3o

5

2
Python 3.3增加了一种用于安全哈希比较的函数:http://docs.python.org/3/library/hmac#hmac.compare_digest - merwok

2

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

在Python 3.x中,您需要对md5函数的参数进行编码,这样相等性也是True。如果不进行编码,则会引发TypeError错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接