为啥不需要 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 中的密码是不是正确?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Ruby 的 bcrypt 库在哈希中包含明文中的盐? [复制]