gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:32:02 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com