猿问

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

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

尾黑尔文章“如何安全地存储密码”声称:

bcrypt有内置的盐类以防止彩虹桌的攻击。

他引用本文,在OpenBSD的实现中bcrypt:

OpenBSD生成128位的bcrypt盐分,它是从一个弧四(arc4随机(3)密钥流中生成的,该密钥流带有内核从设备时间收集的随机数据。

我不明白这是怎么回事。在我对盐的概念中:

  • 对于每个存储的密码,它需要不同,以便为每个密码生成一个单独的彩虹表。
  • 它需要存储在某个地方,以便可以重复:当用户尝试登录时,我们会尝试他们的密码,重复我们最初存储他们密码时所做的盐类和散列过程,并进行比较。

当我用bcrypt使用Design(Rails登录管理器)时,数据库中没有盐列,所以我很困惑。如果盐是随机的,没有存储在任何地方,我们如何可靠地重复哈希过程?

总之,bcrypt怎么会有内置的盐类??


慕尼黑5688855
浏览 1057回答 3
3回答

冉冉说

这是地窖:产生随机盐。“成本”因素已经预先配置好了。收集密码。使用SALT和成本因子从密码中派生加密密钥。用它加密一个著名的字符串。商店代价,盐,以及密码文本。因为这三个元素有一个已知的长度,所以很容易将它们连接起来并存储在一个字段中,但是稍后能够将它们分开。当有人试图验证时,检索存储的成本和盐。从输入密码、成本和盐分中派生密钥。加密同样著名的字符串。如果生成的密码文本与存储的密码文本匹配,则密码是匹配的。bcrypt的工作方式与基于PBKDF 2等算法的传统方案非常相似。主要区别在于它使用派生密钥加密已知的纯文本;其他方案(合理地)假定密钥派生函数是不可逆的,并直接存储派生密钥。存储在数据库中的bcrypt“散列”可能如下所示:$2a$10$vI8aWBnW3fID.ZQ4/zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa这实际上是由“$”分隔的三个字段:2a标识bcrypt使用的算法版本。10是成本因素;210使用关键字派生函数的迭代(顺便说一句,这还不够。我推荐的费用是12英镑或更多。)vI8aWBnW3fID.ZQ4/zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa是SALT和密码文本,在修改的Bas-64中进行连接和编码。前22个字符解码为盐的16字节值。剩下的字符是要比较的密码文本,以便进行身份验证。此示例取自Coda Hale的红宝石实现文档。

largeQ

我认为这句话的措辞应该如下:bcrypt有盐内置于生成的散列中。来防止彩虹桌的袭击。这个bcrypt公用设施本身似乎不维护盐类清单。相反,盐是随机产生的,并附加到函数的输出中,以便以后记住它们(根据的Java实现bcrypt)。换句话说,由bcrypt不是只是哈希。相反,它是哈希和盐连在一起了。

蝴蝶不菲

这是来自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编码的密码匹配,该密码存储在以前的登录/注册过程中存储在数据库中。
随时随地看视频慕课网APP
我要回答