为啥不需要 salt 来比较 bcrypt 中的密码是不是正确?

Posted

技术标签:

【中文标题】为啥不需要 salt 来比较 bcrypt 中的密码是不是正确?【英文标题】:Why isn't salt required to compare whether password is correct in bcrypt?为什么不需要 salt 来比较 bcrypt 中的密码是否正确? 【发布时间】:2017-05-24 16:06:16 【问题描述】:

我想在将密码存储到数据库之前使用 node.js bcrypt 对密码进行哈希处理。

此链接提供文档。 https://github.com/kelektiv/node.bcrypt.js

这是一个对密码进行哈希处理的示例。

var bcrypt = require('bcrypt');
const saltRounds = 10;
const myPlaintextPassword = 's0/\/\P4$$w0rD';

var salt = bcrypt.genSaltSync(saltRounds);
var hash = bcrypt.hashSync(myPlaintextPassword, salt);
// Store hash in your password DB.

这是检查密码的代码。

// Load hash from your password DB.
bcrypt.compareSync(myPlaintextPassword, hash); // true

这是我不明白的。在bcrypt.compareSync中,为什么没有参数salt?既然哈希是从salt生成的,为什么比较明文密码不涉及哈希中使用的原始salt?

【问题讨论】:

【参考方案1】:

盐是 bcrypt 存储在数据库中的字符串的一部分,例如参见Do I need to store the salt with bcrypt?上的答案

【讨论】:

谢谢。如果 salt 是生成的哈希的一部分,那会不会在某种程度上降低 bcrypt 的安全性? 不,它没有。盐必须始终可用,将其与哈希一起存储或单独存储对安全性没有影响。 salt 的目的是防止彩虹表攻击,为此,如果攻击者拥有 salt 就不是问题。

以上是关于为啥不需要 salt 来比较 bcrypt 中的密码是不是正确?的主要内容,如果未能解决你的问题,请参考以下文章

Bcrypt.check_pass/3 用法

为啥 Ruby 的 bcrypt 库在哈希中包含明文中的盐? [复制]

salt-ssh的使用(不需要安装客户端)

为啥 OWASP 不建议在客户端和服务器上都对密码进行 bcrypt?

Mongoose 比较 BCRYPT 密码未填写

bcryptjs