为了账号安全,请及时绑定邮箱和手机立即绑定

bcrypt怎么会有内置的盐类呢?

bcrypt怎么会有内置的盐类呢?

慕尼黑5688855 2019-07-09 16:27:13
bcrypt怎么会有内置的盐类呢?尾黑尔文章“如何安全地存储密码”声称:bcrypt有内置的盐类以防止彩虹桌的攻击。他引用本文,在OpenBSD的实现中bcrypt:OpenBSD生成128位的bcrypt盐分,它是从一个弧四(arc4随机(3)密钥流中生成的,该密钥流带有内核从设备时间收集的随机数据。我不明白这是怎么回事。在我对盐的概念中:对于每个存储的密码,它需要不同,以便为每个密码生成一个单独的彩虹表。它需要存储在某个地方,以便可以重复:当用户尝试登录时,我们会尝试他们的密码,重复我们最初存储他们密码时所做的盐类和散列过程,并进行比较。当我用bcrypt使用Design(Rails登录管理器)时,数据库中没有盐列,所以我很困惑。如果盐是随机的,没有存储在任何地方,我们如何可靠地重复哈希过程?总之,bcrypt怎么会有内置的盐类??
查看完整描述

3 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

这是地窖:

产生随机盐。“成本”因素已经预先配置好了。收集密码。

使用SALT和成本因子从密码中派生加密密钥。用它加密一个著名的字符串。商店代价,盐,以及密码文本。因为这三个元素有一个已知的长度,所以很容易将它们连接起来并存储在一个字段中,但是稍后能够将它们分开。

当有人试图验证时,检索存储的成本和盐。从输入密码、成本和盐分中派生密钥。加密同样著名的字符串。如果生成的密码文本与存储的密码文本匹配,则密码是匹配的。

bcrypt的工作方式与基于PBKDF 2等算法的传统方案非常相似。主要区别在于它使用派生密钥加密已知的纯文本;其他方案(合理地)假定密钥派生函数是不可逆的,并直接存储派生密钥。


存储在数据库中的bcrypt“散列”可能如下所示:

$2a$10$vI8aWBnW3fID.ZQ4/zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa

这实际上是由“$”分隔的三个字段:

  • 2a

    标识

    bcrypt

    使用的算法版本。
  • 10

    是成本因素;2

    10

    使用关键字派生函数的迭代(顺便说一句,这还不够。我推荐的费用是12英镑或更多。)
  • vI8aWBnW3fID.ZQ4/zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa

    是SALT和密码文本,在修改的Bas-64中进行连接和编码。前22个字符解码为盐的16字节值。剩下的字符是要比较的密码文本,以便进行身份验证。

此示例取自Coda Hale的红宝石实现文档。


查看完整回答
反对 回复 2019-07-09
?
largeQ

TA贡献2039条经验 获得超7个赞

我认为这句话的措辞应该如下:

bcrypt有盐内置于生成的散列中。来防止彩虹桌的袭击。

这个bcrypt公用设施本身似乎不维护盐类清单。相反,盐是随机产生的,并附加到函数的输出中,以便以后记住它们(根据的Java实现bcrypt)。换句话说,由bcrypt不是只是哈希。相反,它是哈希盐连在一起了。


查看完整回答
反对 回复 2019-07-09
?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

这是来自SpringSecurity的PasswordEncoder接口文档,

 * @param rawPassword the raw password to encode and match
 * @param encodedPassword the encoded password from storage to compare with
 * @return true if the raw password, after encoding, matches the encoded password from
 * storage
 */
boolean matches(CharSequence rawPassword, String encodedPassword);

这意味着,用户将在下一次登录时再次输入rawPassword,并将其与bcrypt编码的密码匹配,该密码存储在以前的登录/注册过程中存储在数据库中。


查看完整回答
反对 回复 2019-07-09
  • 3 回答
  • 0 关注
  • 1056 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信