下面是我的代码:
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的新手,我只是在玩弄它。我认为这将验证用户对实际密码的散列的输入,但是如果您输入了正确的密码,它仍然显示“访问被拒绝”。有谁能给我指个方向吗?
发布于 2011-07-14 23:19:51
您正在比较两个散列对象,而不仅仅是比较它们的摘要。
将您的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__()操作,则按对象标识(“address”)比较类实例。
您可以看到,通过对这些对象执行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']发布于 2011-07-14 23:20:14
如果您比较这些摘要,这应该是可行的:
if converted.digest() == real.digest():
...发布于 2011-07-14 23:23:26
您正在创建两个不同的hashlib对象,它们并不相等。您需要做的是比较摘要:
if converted.digest() == real.digest():https://stackoverflow.com/questions/6695591
复制相似问题