Hashlib哈希没有正确比较

时间:2011-07-14 15:16:02

标签: python hash hashlib

继承我的代码:

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 个答案:

答案 0 :(得分:10)

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

将您的if更改为if converted.digest() == real.digest(),这应该有效。

通过执行if converted == real,您实际上正在比较两个对象,虽然它们表示对同一个事物进行哈希处理的哈希对象,但它们是不同的对象,因为hashlib哈希对象不实施__cmp____eq____ne__they fall back to comparing the two objects by identity,因为它们是两个不同的对象,所以会返回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']

答案 1 :(得分:4)

如果比较摘要,那应该有效:

if converted.digest() == real.digest():
   ...

答案 2 :(得分:2)

您正在创建两个不同的hashlib对象,它们并不相同。你需要的是比较摘要:

if converted.digest() == real.digest():