12

我一直在研究 bcrypt 哈希,当然,该方案的一大好处是它的“适应性”。但是,与简单地增加对 SHA-1 哈希进行的迭代量相比,它如何变得更具适应性?比如说,不是 SHA-1 对一个值进行 1000 次散列,而是将其增加到 10,000 次迭代。这不是达到同样的目标吗?是什么让 bcrypt 更具适应性?

4

6 回答 6

19

使用散列函数进行多次迭代有一些微妙之处,因为必须涉及某种“加盐”,并且因为现有的散列函数并不像希望的那样“随机”;所以必须小心,在这种情况下你最终会得到PBKDF2。PBKDF2 是为密钥派生而设计的,这与密码哈希并不完全相同,但事实证明它也非常擅长。

bcrypt 与 PBKDF2-with-SHA-1 相比具有(轻微)优势,因为 bcrypt 源自Blowfish分组密码。进行多次迭代的目的是使密码处理速度变慢,尤其是对攻击者而言变慢。我们可以容忍正常、诚实的系统使该功能变慢,因为它阻止了广泛的密码猜测。但是攻击者可能会使用普通系统不使用的硬件,例如可编程 GPU,这会极大地促进适合这种硬件的计算。Blowfish 和 bcrypt 使用基于 RAM 的查找表(已修改的表在处理期间);这样的表对于通用 CPU 来说很容易处理,但在 GPU 上就很麻烦了;因此,bcrypt 在某种程度上阻碍了攻击者使用 GPU 进行的处理增强。这是一个好处,它使得 bcrypt 比 PBKDF2 更适合密码存储。

于 2011-07-24T14:25:11.990 回答
4

两者的替代方案是scrypt。与 bcrypt 不同的是,它不使用有点不寻常的河豚密码,而是使用任何标准的散列函数,并且它专门设计为难以在专用硬件上实现,因为内存和时间效率都低下。

于 2011-07-25T04:01:50.643 回答
3

您的替代方案有点未指定。您没有说如何将密码和盐结合到您的哈希方案中。以错误的方式执行此操作可能会导致漏洞。bcrypt(和其他标准 KDF)的优点是它被明确指定。

如果您在常见的 HMAC-SHA1 模式下查看 PBKDF2,它与您的建议非常相似。

于 2011-07-22T14:05:43.180 回答
1

基本上就是这样。您可以迭代任何哈希函数。有些散列函数比其他的要好,所以要谨慎选择。

例如,MD5 现在被认为是损坏的,属于一类哈希函数,会遭受某些基于前缀的攻击和生日攻击。

bcrypt 是一个很好的经验法则,因为它可以正确处理一些事情(如盐),如果您使用另一个函数,则必须明确实现这些事情。

于 2011-07-22T14:06:33.210 回答
1

正如在另一个答案中所指出的,迭代哈希函数的机制非常重要,因为它可能会意外地削弱算法或仍然无法防止一些时间内存权衡攻击。

这就是为什么 PBKDF2 是你的朋友。它在RFC 2898中有详细说明。PBKDF2 也是面向未来的,因为它不依赖于特定的哈希算法。例如,当 NIST 最终确定 SHA3 时,可以将 MD5 换成 SHA3。

此外,对面向未来的能力略有了解。只要您要保护的密码是“介于 8 到 56 个字符之间”,Bcrypt 就可以工作。如果您的未来出于某种原因需要更长的密码短语,请记住一个重要的问题。

于 2011-07-22T18:43:29.623 回答
-1

我相信“自适应性”与实际加密无关,而是 bcrypt 是一种自适应哈希:随着时间的推移,它可以变得越来越慢,因此它仍然能够抵抗针对哈希和盐的特定蛮力搜索攻击。

(部分引自http://en.wikipedia.org/wiki/Bcrypt

于 2011-07-22T14:07:10.510 回答