我知道像bcrypt这样的密码哈希具有花费很长时间才能运行的主要特性,但是我想知道关于密码哈希的任何事情使它们比仅运行快速加密更胜一筹吗?

特别是,当我只能运行SHA-256 100000次时,为什么bcrypt存在?此外,适应计算能力的提高似乎相对可扩展。当计算机的速度达到今天的100000倍时,我可以将哈希重新应用于密码哈希100000次,并在验证时运行SHA-256 100000 * 100000次以验证密码尝试。这种幼稚的方法是否有缺陷。密码散列是否还有其他属性,使其特别适合于散列密码?缺乏并行性,空间复杂性,还有其他吗?

我的问题是在分析对2012年6月事件的一个显着响应时发生的,该事件中从LinkedIn窃取了600万个密码哈希。在本文中,作者强调了在验证用户密码时使用密码哈希而不是快速加密哈希的价值。我理解散列速度很慢的基本论点,但未能从中汲取教训,使“散列密码”散列变得与众不同的特殊优势。

#1 楼

据我所知,没有正式的区别,因为“密码哈希”尚未正式定义。

这就是说,如果您看一下scrypt的作者的演讲,他想要:


密码散列难以实现CPU的工作(即,需要大量的CPU处理,而这种方式无法进行优化)。硬,即需要大量的RAM容量和RAM I / O带宽。坚硬的内存有助于防止使用其他类型的硬件而获得显着的加速。

简单的SHA散列需要最小的内部状态,因此可以通过在现代图形卡的256+内核上并行运行散列来大大加速。通过创建一堆专用于并行运行SHA操作的FPGA / ASIC芯片,甚至可以实现更大的加速。扩展内存I / O的技术。 FPGA比较便宜。但不是大量的低延迟内存。


对您的问题:


我可以运行SHA-256 100000次吗?


如果您多次遍历同一个哈希函数,那么如果哈希函数不理想,那么每次熵损失都可能很小。请参阅“ PBKDF2为什么对迭代进行x ..”。如果您改进了自己的建议,例如通过在每次迭代中混入盐,那么您将接近PBKDF2的设计。在这种情况下,应该改用PBKDF2,因为PBKDF2是成熟且经过同行评审的设计。 [...]我可以将哈希重新应用到我的密码哈希100000次,并在验证时运行SHA-256 100000 * 100000


这样可行。验证时,最终用户将以纯文本形式提供您的密码。因此,您还可以使用旧的哈希函数针对旧哈希验证密码,并使用新的哈希函数从纯文本创建新哈希。


有关更多信息,请参见scrypt演示文稿以及Crypto上的hash + password标签,以及此处的过去讨论。

请注意:出于您自己的兴趣和理解,对您有所了解非常高兴。在构建生产软件时,您不应创建自己的密码散列实现,而应使用适当的更高级别的库,该库已受到广泛的安全审查。

#2 楼

通常,诸如bcrypt之类的“密码哈希”使用诸如SHA之类的密码哈希,因此就好像“多次运行一个快速的密码哈希”一样。 >
诸如bcrypt之类的密钥派生功能旨在实现其名称所暗示的功能。这具有一些优点:


如果派生密钥被盗,则很难猜测主密钥。
您可以实现针对弱密钥的保护。
scrypt还允许您选择应该消耗多少内存(GPU上暴力破解的重要因素)

了解更多信息http://en.wikipedia.org/wiki/Key_derivation_function,http:// en .wikipedia.org / wiki / PBKDF2,http://en.wikipedia.org/wiki/Bcrypt

但这很完美地总结了一下:http://en.wikipedia.org/wiki/PBKDF2 #Alternatives_to_PBKDF2


PBKDF2的一个弱点是,尽管可以调整其c参数
以使其花费大量计算时间,但用较小的电路和很少的RAM来实现,这使得使用ASIC或GPU的蛮力攻击相对便宜[15]。
bcrypt密钥派生函数需要更大(但仍是固定的)
RAM量,并且对这种攻击的要求略强一些,而
更现代的scrypt [15]密钥派生函数可以任意使用
大量内存,并且更强大。


#3 楼

一遍又一遍地重复像SHA256这样的哈希函数的问题是SHA256流水线非常非常有效。攻击者可能会比您更快地执行哈希,这仅仅是因为他使用了专门设计用于快速进行哈希处理的硬件。然后他还获得了更多硬件,更多金钱等不可避免的好处。

假设您使用100,000个SHA256运算。攻击者可以设计一个自定义ASIC,该ASIC在装配线中执行5,000个SHA256操作。然后,他将连接其中的20个。然后,他将开始将密码输入第一个密码,每个时钟周期输入一个。然后,一秒钟之后,他将开始从最后一个输出中获取输出,每个时钟周期获取一个输出。因此,现在,与其用20个芯片使他的速度比您快20倍(如果他必须使用CPU),他要比您快200万倍(因为他现在每个时钟周期可以执行100,000次SHA256操作)!

加密散列在二进制逻辑运算(例如移位和XOR)上非常繁琐。它们通常没有反馈依赖性,不需要做出任何决定,依此类推。这使它们易于在GPU,FPGA和ASIC上实现,其性能要比通用CPU高出几个数量级。

密码散列在内存使用和决策方面非常繁琐。他们需要打破管道的反馈依赖性。攻击者可能无法比使用大量通用CPU做得更好。

因此,在SHA256上花费200万美元的攻击者可以花费30万美元来设计可SHA256操作比CPU快1000倍。然后,他可以以每本60美元的价格在ASIC副本上花费170万美元。那使他比你快了三千万倍。拥有200万美元用于密码哈希的攻击者只需购买大量通用CPU。因此,他可以花200万美元在CPU上,每个CPU花费40美元。那使他比您快50,000倍。此差异是600的因数。

因此,使用占用密码时间和加密哈希一样多的CPU时间的密码哈希对攻击者来说是600倍。这相当于在密码上增加了9位熵。