6

这是我的代码:

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 的新手,我只是在玩弄它。我认为这样做是验证用户输入的实际密码的哈希值,但是如果您输入正确的密码,它仍然会出现“访问被拒绝”。谁能指出我正确的方向?

4

3 回答 3

14

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

改变你ifif converted.digest() == real.digest(),这应该工作。

通过这样做if converted == real,您实际上是在比较两个对象,虽然它们代表一个对同一事物进行哈希处理的哈希对象,但它们是不同的对象,并且由于hashlib哈希对象不实现__cmp__,__eq____ne__它们回退到比较两个对象通过 identity,因为它们是两个不同的对象,所以将返回 false。

从文档链接:

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

您可以看到这些对象并没有通过dir()对它们执行 a 来实现这些运算符:

>>> 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']
于 2011-07-14T15:19:50.573 回答
4

如果您比较摘要,那应该可以:

if converted.digest() == real.digest():
   ...
于 2011-07-14T15:20:13.943 回答
2

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

if converted.digest() == real.digest():
于 2011-07-14T15:23:25.883 回答