为什么在bcrypt中比较密码是否正确不需要盐?

25

我想使用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参数?既然哈希是从盐值生成的,为什么比较明文密码不涉及散列时使用的原始盐值呢?


vI8aWBnW3fID.ZQ4/zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa 是盐和密码文本,连接并以修改的Base-64编码。前22个字符解码为盐的16字节值。
参见 https://stackoverflow.com/questions/6832445/how-can-bcrypt-have-built-in-salts 了解更多信息。
盐与哈希密码一起存储为bcrypt字符串,并在比较时从bcrypt字符串中提取出来。(我认为)
- undefined
1个回答

22

谢谢。如果盐是生成哈希的一部分,那么这是否会使bcrypt的安全性降低? - guagay_wk
4
不,它不会。盐始终必须可用,将其与哈希一起存储或分开存储对安全性没有影响。盐的目的是防止彩虹表攻击,为此,如果攻击者拥有盐,则不会存在问题。 - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接