bcrypt 中的密码检查如何工作?

Ole*_*kyi 6 python bcrypt

bcrypt 所以,我在文档中找到了以下示例:

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 :(")
Run Code Online (Sandbox Code Playgroud)

这似乎有效。但我不明白怎么办。我们不应该使用 salt 来生成哈希值来进行检查吗?

我的意思是,我们生成了一次盐,但没有将其保存在变量中。但是接下来我们想要使用函数来比较哈希值和密码checkpw,但是它如何知道使用哪种盐来生成哈希值以进行比较呢?

LSe*_*rni 9

生成的“哈希”还包含盐。它采用模块化加密格式,记录在此处(感谢@Masklinn)

$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
      |<---    salt     --->||<---- confirmation hash ---->|
Run Code Online (Sandbox Code Playgroud)

“2a”部分给出了正在使用的模块化哈希的信息,“10”是对数成本参数(即算法将迭代 2 10次)。

因此,为了验证密码是否匹配,您将使用 的解码作为N9qo8uLOickgx2ZMRZoMye盐来重新启动 bcrypt。

  • 也许链接到 Passlib 关于 [模块化 crypt 格式](https://passlib.readthedocs.io/en/stable/modular_crypt_format.html) 的页面,因为它更一般地解释了格式是如何生成的以及它包含哪些信息? (2认同)

Tom*_*ger 5

盐被保存在哈希本身中。bcrypt 的方案如下所示:

$<used_algorithm>$<cost_factor>$<generated_salt><hash>$
Run Code Online (Sandbox Code Playgroud)