严格来说,bcrypt实际上是对文本进行加密:
Orphean旁观者ScryDoubt
64 次。
但它使用从您的密码和一些随机生成的盐派生的密钥来执行此操作。
密码散列不是散列
“密码散列算法” (如 bcrypt)的真正优点是它们使用大量 RAM。
SHA2旨在快速。如果您是实时 Web 服务器,并且想要验证文件完整性,那么您需要运行速度非常快、资源使用率非常低的东西。那是密码散列的对立面。
- SHA2 旨在快速
- SHA2 可以使用 128 字节的 RAM
- SHA2 很容易在硬件中实现
- 我拥有一个可以每秒计算3.3 亿次哈希的 USB 记忆棒设备
- 事实上,我拥有其中的 17 个
如果您多次执行“快速”哈希(例如,10,000 是PBDKF2 的常见建议),那么您并没有真正添加任何安全性。
您需要的是一个难以在硬件中实现的哈希。您需要的是在 GPU 上难以并行化的哈希。
在过去的几十年里,我们了解到 RAM 是减缓密码哈希尝试的关键。定制硬件擅长执行原始计算(事实上,只有 1% 的 CPU 专用于计算 - 其余的专用于将机器指令快速转换为更快的东西;预取、乱序执行、分支预测、缓存)。阻碍定制硬件的方法是让算法不得不接触大量的 RAM。
- SHA2:128 字节
- bcrypt:4 KB
- scrypt(可配置):16 MB 莱特币
- Argon2(可配置):文档示例中为 64 MB
密码散列并不意味着简单地多次使用快速散列。
- 现代推荐的 bcrypt 成本因子是 12;因此计算大约需要 250 毫秒。
- 您将不得不执行大约 330,000 次 SHA2 迭代,才能等于现代单核 CPU 上的时间成本
但后来我们回到我的 2.5W、USB、SHA2 棒,它是 330 哈希/秒。为了防御这种情况,它必须是 83M 迭代。
- 如果你试图只增加CPU成本:你就输了。
- 你必须增加内存成本
bcrypt 已经 21 岁了,它只使用了 4KB。但它仍然比任何数量的 MD5、SHA-1 或 SHA2 散列都要好。