python - 为什么可以将bcrypt.hashpw同时用于哈希和验证密码?

标签 python hash salt bcrypt

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/

相关文章:

php - 从其他用户领域生成盐

mysql - 密码散列和加盐——这是一个好方法吗?

codeigniter - 使用 Codeigniter 存储密码的最安全方法是什么?

Python 3,用逗号对操作数进行切片

python - 为什么 python 导入重命名为前导下划线

Ruby 在哈希中插入键值元素

python - 使用 M2Crypto 在 Python 2.4 中生成 SHA-256 哈希

java - 如果数组列表中没有唯一元素,我需要打印 Null

python - buzz-python-client 需要的 consumer secret 从哪里获取?

python - 在 __str__ 下调用 print(self) 会抛出 RecursionError