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