bcrypt不需要存储盐吗?

信息安全 bcrypt
2021-08-11 09:38:05

我对 bcrypt 感到困惑,我认为我需要存储我的盐,然后将我的纯文本密码 + 盐与散列密码进行比较,但是从文档来看,它看起来根本不需要存储盐。事实上,我使用这段代码来创建盐和散列密码:

  let salt = await bcrypt.genSalt(10);

  const saltpasshash = await new Promise((resolve, reject) => {
    bcrypt.hash(plain_text_password, salt, function(err, hash) {
      if (err) reject(err)
      resolve(hash)
    });
  })

  //NOTE I SAVE saltpasshash as users pass and the salt in a separate field in the users table.

这行得通,我感到困惑的是,如果我进行如下比较,它将返回一个有效结果:

valid = await bcrypt.compare(plain_text_password, user.saltpasshash);

我很困惑为什么当我不提供盐时这会有效,如果是这样,为什么要储存盐呢?

1个回答

来自Wikipedia 上对 bcrypt 的描述

...哈希字符串的其余部分包括成本参数、128 位盐(Radix-64 编码为 22 个字符)和 184 位生成的哈希值(Radix-64 编码为 31 个字符)

因此,盐会自动包含在输出字符串中,这意味着无需自己添加。