可能重复:
是否有安全专家推荐 bcrypt 用于密码存储?
我不是安全专家,不要假装这就是我在这里问的原因。我编写了许多基于 PHP 的应用程序,到目前为止,我一直在使用 bcrypt 来散列我的密码。
scrypt 网站声称比 bcrypt 慢 4000 倍,这个说法真的正确吗?如果是这样,对于有安全意识的开发人员来说,切换到使用 scrypt 而不是 bcrypt 会“更好”吗?
可能重复:
是否有安全专家推荐 bcrypt 用于密码存储?
我不是安全专家,不要假装这就是我在这里问的原因。我编写了许多基于 PHP 的应用程序,到目前为止,我一直在使用 bcrypt 来散列我的密码。
scrypt 网站声称比 bcrypt 慢 4000 倍,这个说法真的正确吗?如果是这样,对于有安全意识的开发人员来说,切换到使用 scrypt 而不是 bcrypt 会“更好”吗?
Scrypt 应该比 bcrypt “更好”,但它也比 bcrypt 更近,这很糟糕(因为“更近”本质上意味着“受到的审查更少”)。
所有这些密码散列方案都试图使攻击者处理单个密码的成本更高,同时又不会使您的服务器成本过高。由于您的服务器基本上是一台 PC,并且攻击者可以为他的任务选择最有效的硬件,因此密码散列方案试图使他们的最佳平台是 PC。PBKDF2 可以通过 GPU 彻底优化,而 bcrypt 和 scrypt 对 GPU 的友好性要低得多。Bcrypt 和 scrypt 都需要快速 RAM,这是 GPU 中的稀缺资源(GPU 可以有很多 RAM,但不能同时从所有内核访问它)。
碰巧现代FPGA嵌入了许多小的 RAM 块,这些块对于优化使用 bcrypt 的并行字典攻击非常方便:这意味着攻击者将通过使用价值 1000 美元的 FPGA 而不是价值 1000 美元的通用 PC 获得巨大的提升。这是我们想要避免的那种提升。因此需要更多 RAM 的 scrypt;对于 PC 来说不算太多(我们在这里只讨论几兆字节),但足以让 FPGA 的生活变得艰难(有关问题的详细处理,请参阅此答案)。
因此,理论上,scrypt 应该比 bcrypt 更好。然而,这一切都取决于 scrypt 是否兑现了它的加密承诺。这种稳健性的保证只能通过时间来实现:如果该方案能够经受住密码学家多年的无情攻击,它就会被认为是安全的。需要多少时间,当然有点主观,也很大程度上取决于曝光度(方案部署越广泛,目标就越“有趣”,因为打破它会增加学术声誉肇事者;因此吸引了更多的审查)。我自己的经验法则是在发布后等待大约 5 年,因此对于 scrypt 来说是 2014 年。
还有可用性问题:如果你想使用一个函数,那么你需要一个可以插入到你使用的编程框架中的实现。
我会对“Scrypt 比 BCrypt 慢 4000 倍”的断言持保留态度。首先,这两种算法都是可变复杂的;即使那个“4000x”数字成立,你也可以通过在密钥推导中增加 11 轮来使 BCrypt 变得同样慢。其次,在某些时候,SCrypt 和 BCrypt 都受到在普通用户计算机上合法计算一个哈希所需的时间的限制(或者如果您正在为 Web 应用程序在服务器端进行计算,则在您的服务器上)。SCrypt 速度慢 4000 倍可能会比增加的安全性增加您网站的跳出率。
选择 BCrypt 的理由:
BCrypt 已有 14 年历史,基于超过 20 年历史的密码,并且两者都没有显示出任何可行的理论弱点(Blowfish 中有一个已知的明文漏洞,丝毫不会影响 BCrypt,但有如果 BCrypt 的一个 UNIX 实现中的错误可能会导致应用程序失败,如果它被输入某些字符代码)。
SCrypt 只有 3-4 年的历史,因此它没有获得大多数密码学家信任所需的密码分析谱系。这并不意味着它很脆弱。这意味着mopst安全专家对它还没有受到攻击的信心不足。
选择 SCrypt 而不是 BCrypt 的原因只有一个,这也是设计 SCrypt 的原因:BCrypt 对抗分布式破解系统的主要弱点是低且持续的内存使用量。这使得 BCrypt 容易受到使用相对便宜的现场可编程门阵列或 FPGA 的经济高效的暴力破解。这些阵列在其逻辑块中内置了相对少量的 SRAM,这仍然足以保存 BCrypt 的状态数据。正如 Thomas 所说,与传统的基于 CPU 或 GPU 的破解机器人的分布式网络相比,这些阵列的购买和设置成本更低,因此,攻击者可以从他的钱中获得更多收益。
相比之下,SCrypt 不仅使用指数时间,还使用指数内存;随着推导轮数的增加,SCrypt 需要存储一系列中间状态数据“快照”,用于进一步的推导操作。这对于合法用户的计算机生成一个哈希(您可能最多使用几 MB)来说没有问题,但是 FPGA 块的有限内存很快就会变得不够用。现在,任何你可以存储的东西,你都可以“按需”计算,但是因为这些中间状态中的每一个都是它自己的指数复杂的一系列操作的结果(每个操作都比最终的哈希复杂度低,但是必须计算更多次以供按需使用),攻击者现在处于两难境地;他们要么需要成倍增加的 FPGA 来跟上按需模型增加的计算时间,要么需要将 FPGA 升级到具有足够内存的东西来完成这项工作(基本上你正在考虑简单的高时钟 CPU/FSB /RAM 架构,这就是价值数百万美元的 petaflop 分布式集群的背后)。无论哪种方式,FPGA 不再像 BCrypt(或 PBKDF2)那样可行。
使用 scrypt 除了增加计算量之外,您还可以增加计算散列所需的内存量。这不会对软件实现造成太大影响,但使用硬件实现起来要困难得多——这是专门的攻击者可能开发和使用的。bcrypt(和 PBKDF2)使用恒定且少量的内存。
-奥里普
根据https://stackoverflow.com/questions/1226513/whats-the-advantage-of-scrypt-over-bcrypt