encryption - 为什么 BCrypt 对彩虹表特别有效?
问题描述
如果有人拥有 BCrypt 的加密功能,并加密密码字典并将其存储在 cd 上。获取对数据库中散列密码的访问权限,他们不应该能够吗?
我希望答案是否定的。如果是这样,为什么不呢?
解决方案
Bcrypt 与其他 PBKDF 函数一样,包括加盐和拉伸。加盐意味着它在密码中添加了一些额外的随机数据。盐是公开的。因此,例如,如果我的 salt 是“f588d29a”,而我的密码是“password”,那么我实际上要散列的是“f588d29apassword”(这并不是 bcrypt 的确切做法,但它是等价的)。
加盐后,您将进行散列(稍后再进行),输出将是:“f588d29a, hash ”。所以盐和哈希是众所周知的。但是现在包含“密码”的彩虹表没有任何用处。你需要“f588d29apassword”和“aaaaaaaapassword”和“aaaaaaabpassword”还有......很多密码散列。因此,这大大增加了您需要的时间和空间。更长的盐可以使攻击者的攻击变得非常困难,而防御者的成本却很低。这是使彩虹表基本无用的部分。即使我发现多个人使用相同的密码,他们的哈希值也会不同,所以我的表也无济于事。
bcrypt(和其他 PBKDF)的后半部分是拉伸的,这意味着执行散列函数是时间密集型的。我们通常说的是几十毫秒,所以这对人类或一个哈希来说并不是什么大问题,但它使密码猜测变得更加昂贵。
推荐阅读
- java - 如何使用 Joda-Time 计算两个日期之间的年数、月数和天数
- php - 使用 laravel 下载和删除文件时弹出不来
- php - Windows 中是否存在根文件系统,尤其是在 Windows 10 中?
- ios - 在飞行模式下,CTCarrier 中的 isoCountryCode 不返回 nil
- sql - 无法连接到 AWS 中的 SQL 数据库(无法访问服务器)
- java - OpenCV VideoCapture 从视频中删除 alpha 通道
- javascript - 如何使用谷歌应用脚本获取谷歌表格中特定列的最后一个单元格?
- node.js - NodeJS - 从 java 密钥库文件中导出私钥
- android - Android 8.1.0 未选择最佳匹配图标大小
- pdf - 将 HTML 转换为 PDF Puppeteer