Hashlib哈希值不能正确比较的问题

7
这是我的代码:
import hashlib

real = hashlib.sha512("mom")

status = True

while status:
    inp = raw_input("What's the password?")
    converted = hashlib.sha512(inp)

    if converted == real:
        print "Access granted!"
        status = False
    else:
        print "Access denied."

我对hashlib不熟悉,只是在试着使用它。我原以为这样可以验证用户输入的密码是否与实际密码的哈希值匹配,但是即使输入正确的密码,仍然会显示“拒绝访问”。有谁能指导我一下吗?

3个回答

15

您正在比较两个哈希对象,而不是仅比较它们的摘要。

将您的if更改为if converted.digest() == real.digest(),那应该可以工作。

通过执行if converted == real,您实际上正在比较这两个对象,虽然它们表示确实散列到相同的内容,但它们是不同的对象,并且由于hashlib哈希对象没有实现__cmp____eq____ne__它们会回退到按标识比较两个对象, 因为它们是两个不同的对象,所以返回false。

从文档链接中可以看出:

如果未定义__cmp__()__eq__()__ne__()操作,则类实例将通过对象标识(“地址”)进行比较。

您可以通过对它们执行dir()来查看这些对象是否实现了这些运算符:

>>> test = hashlib.sha512('test')
>>> dir(test)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__',
 '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
 '__sizeof__', '__str__', '__subclasshook__', 'block_size', 'copy', 'digest',
 'digest_size', 'digestsize', 'hexdigest', 'name', 'update']

4
如果您比较摘要,那应该可以正常工作:
if converted.digest() == real.digest():
   ...

2
你正在创建两个不同的hashlib对象,它们不相等。你需要比较摘要信息:
if converted.digest() == real.digest():

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