bcrypt 中的密码检查如何工作?
How does password checking in bcrypt work?
所以,我在bcrypt
docs中找到了下面的例子:
password = b"super secret password"
hashed = bcrypt.hashpw(password, bcrypt.gensalt())
if bcrypt.checkpw(password, hashed):
print("It Matches!")
else:
print("It Does not Match :(")
它似乎有效。但我不明白如何。我们不应该使用 salt 来生成一个散列来检查吗?
我的意思是,我们生成了一次盐,但没有将其保存在变量中。但是接下来我们想用函数checkpw
来比较hash和password,但是它怎么知道用哪个salt来生成hash来比较呢?
生成的“散列”也包含盐。它采用模块化地穴格式,记录在案here(感谢@Masklinn)
a$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
|<--- salt --->||<---- confirmation hash ---->|
“2a”部分给出了有关正在使用的模块化哈希的信息,“10”是对数成本参数(即算法将迭代 210 次)。
因此,为了验证密码是否匹配,您将使用 N9qo8uLOickgx2ZMRZoMye
的解码作为盐重新启动 bcrypt。
盐被保存在哈希本身中。 bcrypt 的方案如下所示:
$<used_algorithm>$<cost_factor>$<generated_salt><hash>$
所以,我在bcrypt
docs中找到了下面的例子:
password = b"super secret password"
hashed = bcrypt.hashpw(password, bcrypt.gensalt())
if bcrypt.checkpw(password, hashed):
print("It Matches!")
else:
print("It Does not Match :(")
它似乎有效。但我不明白如何。我们不应该使用 salt 来生成一个散列来检查吗?
我的意思是,我们生成了一次盐,但没有将其保存在变量中。但是接下来我们想用函数checkpw
来比较hash和password,但是它怎么知道用哪个salt来生成hash来比较呢?
生成的“散列”也包含盐。它采用模块化地穴格式,记录在案here(感谢@Masklinn)
a$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
|<--- salt --->||<---- confirmation hash ---->|
“2a”部分给出了有关正在使用的模块化哈希的信息,“10”是对数成本参数(即算法将迭代 210 次)。
因此,为了验证密码是否匹配,您将使用 N9qo8uLOickgx2ZMRZoMye
的解码作为盐重新启动 bcrypt。
盐被保存在哈希本身中。 bcrypt 的方案如下所示:
$<used_algorithm>$<cost_factor>$<generated_salt><hash>$