将 bcrypt
与Python 2.7结合使用,我可以看到该示例使用bcrypt.hashpw
对存储的密码进行哈希处理,并验证给定的密码与哈希处理的密码匹配,如下所示:
散列
import bcrypt
password = b"somepassword"
hashed = bcrypt.hashpw(password, bcrypt.gensalt())
好的,到目前为止很好。给定的密码现在使用bcrypt进行哈希处理,因此它是一列哈希字节。
验证中
现在,这是让我感到困惑的部分:要检查纯文本密码是否与哈希密码匹配,使用相同的功能,并使用哈希密码作为补充:
if bcrypt.hashpw(password, hashed) == hashed:
print("It Matches!")
else:
print("It Does not Match :(")
发生了什么?
由于输入盐不同,两个
bcrypt.hashpw
调用的结果是否应该不同?我能想到的唯一合理的答案是,该盐在添加到哈希密码之前会被截断为固定长度。这样,在使用哈希结果时,仅保留生成的盐(在剥离尾随的哈希密码之后),并且使用截断后的盐对密码进行哈希的结果与原始盐相同。不过,我没有任何证据支持这一点。
为什么这样做?
最佳答案
在表达式bcrypt.hashpw(password, hashed)
中,仅hashed
的前两个字符用于表示盐,而不是整个字符串。
例如,在此示例中,hashpw()
的输出如何以salt开头:
salt1 = b"$2a$12$w40nlebw3XyoZ5Cqke14M."
print "salt1:", salt1
print "hash1:", bcrypt.hashpw(password, salt1)
打印:
salt1: $2a$12$w40nlebw3XyoZ5Cqke14M.
hash1: $2a$12$w40nlebw3XyoZ5Cqke14M.d.7cdO2wJhr/K6ZSDjODIxLrPmYzY/a
因此有一个约定,即盐只在第一个字符或前29个字符中出现。
关于python - 为什么可以将bcrypt.hashpw同时用于哈希和验证密码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27413248/