bcrypt.compare函数为何适配不同genSalt值仍能正确验证密码?
bcrypt的compare函数为何无需指定salt值就能验证密码?
你在项目中使用bcrypt的代码如下:
生成哈希时:
const salt = await bcrypt.genSalt(10); const hashedPassword = await bcrypt.hash(password,salt);
验证密码时:
const isMatch = await bcrypt.compare(password,hashedpassword);
核心原因很简单:bcrypt生成的哈希字符串本身就包含了验证所需的全部关键信息,包括使用的salt值、哈希时的rounds(也就是你调用genSalt时传入的数值),以及最终的哈希结果。
bcrypt的哈希字符串遵循固定格式,大致结构是:$2b$[rounds]$[salt][hash]
举个实际例子:$2b$10$nOUIs5kJ7naTuTFkBy1veuK0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
10就是你调用genSalt时传入的rounds数值- 紧随其后的22个字符是随机生成的salt值
- 剩下的部分就是密码经过salt和rounds处理后的最终哈希
当你调用bcrypt.compare时,函数会自动完成以下步骤:
- 从传入的哈希字符串中解析出rounds数和salt值
- 用解析出的rounds和salt,对用户输入的密码重新执行哈希操作
- 将新生成的哈希与原哈希字符串中的哈希部分对比
- 若完全一致则返回
true,否则返回false
所以不管你哈希时用的是10、12还是其他rounds数值,生成的哈希里都已经包含了这个参数,compare函数会自动读取并复用,自然能正确验证密码是否匹配。
内容的提问来源于stack exchange,提问作者Paras
相关产品推荐
相关产品推荐

