Hashlib哈希没有正确比较

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

我是hashlib的新手,我只是在玩它.我认为这样做会验证用户输入实际密码的哈希值,但是如果输入正确的密码,它仍会出现"访问被拒绝".谁能指出我正确的方向?

Dan*_*olo 10

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

改变你ifif 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']
Run Code Online (Sandbox Code Playgroud)