【发布时间】:2015-02-09 08:52:53
【问题描述】:
在 Python 2.7 中使用bcrypt,我可以看到该示例使用bcrypt.hashpw 对密码进行哈希存储并验证给定密码是否与哈希密码匹配,如下所示:
散列
import bcrypt
password = b"somepassword"
hashed = bcrypt.hashpw(password, bcrypt.gensalt())
好的,到目前为止一切顺利。给定的密码现在使用 bcrypt 进行哈希处理,因此它是一串哈希字节。
验证
现在,让我感到困惑的部分是:为了检查明文密码是否与散列密码匹配,使用了 same 函数,将散列密码用作盐:
if bcrypt.hashpw(password, hashed) == hashed:
print("It Matches!")
else:
print("It Does not Match :(")
发生了什么?
由于输入盐不同,两个bcrypt.hashpw 调用的结果不应该不同吗?
我能想到的唯一合理的答案是盐在被添加到散列密码之前被截断为固定长度。这样,当使用散列的结果时,只剩下生成的盐(在剥去尾随的散列密码之后),并且用截断的盐散列密码的结果与原始相同。不过,我没有任何证据支持这一点。
为什么会这样?
【问题讨论】: