Nat*_*ong 570 security hash internals bcrypt
Coda Hale的文章"如何安全地存储密码"声称:
bcrypt内置了盐来防止彩虹表攻击.
他引用了这篇论文,其中说在OpenBSD的实现中bcrypt
:
OpenBSD从arcfour(arc4random(3))密钥流生成128位bcrypt salt,并使用内核从设备时序收集的随机数据进行种子处理.
我不明白这是如何工作的.在我的盐概念中:
当我使用带有bcrypt的Devise(一个Rails登录管理器)时,数据库中没有salt列,所以我很困惑.如果盐是随机的并且没有存储在任何地方,我们如何可靠地重复散列过程?
简而言之,bcrypt如何内置盐?
eri*_*son 733
这是bcrypt:
生成随机盐.已经预先配置了"成本"因素.收集密码.
使用salt和cost因子从密码派生加密密钥.用它来加密一个众所周知的字符串.存储成本,盐和密文.因为这三个元素具有已知的长度,所以很容易将它们连接起来并将它们存储在单个字段中,但是稍后可以将它们分开.
当有人尝试进行身份验证时,检索存储的成本和盐.从输入密码,成本和盐中获取密钥.加密相同的知名字符串.如果生成的密文与存储的密文匹配,则密码匹配.
Bcrypt以与基于诸如PBKDF2的算法的更传统方案非常类似的方式操作.主要区别在于使用派生密钥加密已知的纯文本; 其他方案(合理地)假设密钥派生函数是不可逆的,并直接存储派生密钥.
存储在数据库中的bcrypt
"哈希"可能如下所示:
$ 2A $ 10 $ vI8aWBnW3fID.ZQ4/zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa
这实际上是三个字段,由"$"分隔:
2a
标识bcrypt
所使用的算法版本.10
是成本因素; 2 使用密钥派生函数的10次迭代(顺便说一下这是不够的.我建议成本为12或更多.)vI8aWBnW3fID.ZQ4/zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa
是盐和密文,在修改后的Base-64中连接和编码.前22个字符解码为盐的16字节值.其余字符是要进行身份验证的密文.这个例子来自Coda Hale的ruby实现的文档.
Ada*_*ter 171
我认为这句话应该措辞如下:
bcrypt 在生成的哈希中内置了盐,以防止彩虹表攻击.
该bcrypt
实用程序本身似乎并没有维持盐的列表.相反,盐是随机生成的,并附加到函数的输出中,以便稍后记住它们(根据Java实现bcrypt
).换句话说,所产生的"散列" bcrypt
不只是哈希值.相反,它是哈希和盐连接.
小智 19
这是一个简单的术语...
Bcrypt 没有数据库,它存储盐......
盐以 Base64 格式添加到哈希中......
问题是bcrypt在没有数据库的情况下如何验证密码...?
bcrypt 的作用是从密码哈希中提取盐...使用提取的盐来加密纯密码,并将新哈希与旧哈希进行比较,看看它们是否相同...
为了让事情变得更清楚,
密码+盐使用由成本、盐和密码生成的密钥进行加密。我们将该加密值称为cipher text
。然后我们将盐附加到该值并使用 base64 对其进行编码。附加成本,这是生成的字符串bcrypt
:
$2a$COST$BASE64
该值最终被存储。
如果攻击者控制了数据库,攻击者将轻松解码 Base64 值,然后他将能够看到盐。盐不是秘密。虽然它是随机的。然后他需要解密cipher text
。
更重要的是:这个过程中没有散列,而是CPU昂贵的加密-解密。因此彩虹表在这里不太相关。
归档时间: |
|
查看次数: |
129580 次 |
最近记录: |