【发布时间】:2011-10-11 02:12:30
【问题描述】:
我一直在研究 bcrypt 哈希,当然,该方案的一大好处是“适应性”。但是,与简单地增加对 SHA-1 哈希进行的迭代次数相比,它如何变得更具适应性?比如说,不是 SHA-1 对一个值进行 1000 次散列,而是将其增加到 10,000 次迭代。这不是达到同样的目标吗?是什么让 bcrypt 更具适应性?
【问题讨论】:
标签: security hash cryptography bcrypt
我一直在研究 bcrypt 哈希,当然,该方案的一大好处是“适应性”。但是,与简单地增加对 SHA-1 哈希进行的迭代次数相比,它如何变得更具适应性?比如说,不是 SHA-1 对一个值进行 1000 次散列,而是将其增加到 10,000 次迭代。这不是达到同样的目标吗?是什么让 bcrypt 更具适应性?
【问题讨论】:
标签: security hash cryptography bcrypt
您的替代方案有点未指定。您没有说如何将密码和盐结合到您的哈希方案中。以错误的方式执行此操作可能会导致漏洞。 bcrypt(和其他标准 KDF)的优势在于它的明确性。
如果您在常见的 HMAC-SHA1 模式下查看 PBKDF2,它与您的建议非常相似。
【讨论】:
基本上就是这样。您可以迭代任何哈希函数。有些哈希函数比其他的要好,所以要谨慎选择。
例如,MD5 现在被认为是损坏的,属于一类哈希函数,会遭受某些基于前缀的攻击和生日攻击。
bcrypt 是一个很好的经验法则,因为它可以正确处理一些事情(例如盐),如果您使用另一个函数,则必须明确实现这些事情。
【讨论】:
我认为“自适应性”与实际加密无关,而是 bcrypt 是一种自适应哈希:随着时间的推移,它可以变得越来越慢,因此它仍然能够抵抗针对哈希的特定蛮力搜索攻击和盐。
【讨论】:
正如另一个答案中所述,迭代哈希函数的机制非常重要,因为它可能会意外地削弱算法或仍然无法防止一些时间-内存权衡攻击。
这就是为什么 PBKDF2 是你的朋友。在RFC 2898 中有详细说明。 PBKDF2 也是面向未来的,因为它不依赖于特定的哈希算法。例如,当 NIST 最终确定 SHA3 时,可以将 MD5 换成 SHA3。
此外,对面向未来的能力略有了解。只要您要保护的密码是“between 8 and 56 characters”,Bcrypt 就可以工作。如果您的未来出于某种原因需要更长的密码短语,请记住一个重要的问题。
【讨论】:
使用哈希函数进行多次迭代有一些微妙之处,因为必须涉及某种“加盐”,并且因为现有的哈希函数并不像希望的那样“随机”;所以必须小心,在这种情况下你最终会得到PBKDF2。 PBKDF2 是为密钥派生而设计的,这与密码散列并不完全相同,但事实证明它也很擅长。
bcrypt 与 PBKDF2-with-SHA-1 相比具有(轻微的)优势,因为 bcrypt 源自 Blowfish 分组密码。进行多次迭代的目的是使密码处理速度变慢,尤其是对攻击者而言变慢。我们容忍该功能对于正常、诚实的系统来说是缓慢的,因为它阻止了广泛的密码猜测。但是攻击者可能会使用正常系统不使用的硬件,例如programmable GPU,它极大地促进了非常适合这种硬件的计算。 Blowfish 和 bcrypt 使用基于 RAM 的查找表(在处理过程中修改的表);这样的表对于通用 CPU 来说很容易处理,但在 GPU 上就很麻烦了;因此,bcrypt 在某种程度上阻碍了攻击者使用 GPU 进行的处理增强。这是一个好处,它使得 bcrypt 比 PBKDF2 更适合密码存储。
【讨论】:
两者的替代方案是scrypt。与 bcrypt 不同的是,它不使用有点不寻常的河豚密码,而是使用任何标准的哈希函数,而且它专门设计为难以在专用硬件上实现,因为内存和时间效率都很低。
【讨论】: