Hashlib 哈希比较不正确

7 投票
3 回答
6337 浏览
提问于 2025-04-16 21:31

这是我的代码:

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 个回答

2

你创建了两个不同的hashlib对象,它们是不相等的。你需要做的是比较它们的摘要:

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

如果你对比一下摘要,这样应该就能解决问题:

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

你现在比较的是两个哈希对象,而不是它们的哈希值。

把你的 if 改成 if converted.digest() == real.digest(),这样就可以正常工作了。

因为你用 if converted == real 进行比较时,其实是在比较这两个对象本身。虽然它们代表的哈希值是一样的,但它们是不同的对象。而且由于 hashlib 的哈希对象没有实现 __cmp____eq____ne__,所以 它们会根据对象的身份进行比较。因为这两个对象是不同的,所以比较结果会是假的。

根据文档链接:

如果没有定义 __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']

撰写回答