我需要用 bcrypt 存储盐吗?

Posted

技术标签:

【中文标题】我需要用 bcrypt 存储盐吗?【英文标题】:Do I need to store the salt with bcrypt? 【发布时间】:2010-09-21 13:55:32 【问题描述】:

bCrypt's javadoc 有这个密码如何加密的代码:

String pw_hash = BCrypt.hashpw(plain_password, BCrypt.gensalt()); 

要检查明文密码是否与之前经过哈希处理的密码匹配,请使用 checkpw 方法:

if (BCrypt.checkpw(candidate_password, stored_hash))
    System.out.println("It matches");
else
    System.out.println("It does not match");

这些代码 sn-ps 向我暗示随机生成的盐被扔掉了。是这样吗,还是这只是一个误导性的代码 sn-p?

【问题讨论】:

【参考方案1】:

盐被合并到哈希中(以 base64 样式格式编码)。

例如,在传统的 Unix 密码中,salt 存储为密码的前两个字符。其余字符代表哈希值。检查器函数知道这一点,并将散列分开以取出盐。

【讨论】:

密码中包含盐。所以你不必保存盐。 谢谢。我希望他们在 javadoc 中这么说 :) (我已经查看了源代码并确认了 - 但我之前不知道我在寻找什么) 谢谢 - 我也试图解决这个问题!现在我想知道这是否是个好主意。将盐保存在哈希中而不是单独存储它有优点/缺点吗? @Adam - 由于盐是随机生成的,这意味着您不需要将数据库中的两者关联起来的方法。 我查看了源代码,发现虽然 salt 参数的 JavaDoc 是“可能使用 BCrypt.gensalt 生成的”,但我发现你必须使用 genSalt() 方法或者你获取异常 =/

以上是关于我需要用 bcrypt 存储盐吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何将密码文本与 bcrypt 哈希值进行比较?

Bcrypt 是用于散列还是加密?有点迷茫

我应该使用啥列类型/长度将 Bcrypt 散列密码存储在数据库中?

什么是盐轮以及盐如何存储在 Bcrypt 中?

盐和密码[重复]

用 bcrypt (PHP) 比较两个哈希值