为什么不迭代哈希函数10,000,000次呢?

时间:2013-09-24 21:16:45

标签: php hash passwords

我已经在SO上阅读了很多关于如何实现密码散列的帖子。而且我已经读过你不应该多次散列密码(好吧,它没有多大帮助,据说)。但为什么不呢?如果我迭代哈希密码,比方说10,000,000次(因为用户可以等待3秒钟完成注册,或者我可以通过发送AJAX请求来实现)。

那么,攻击者如何窃取我的数据库,甚至知道我只是将密码重复10,000,000次(最坏情况),可能会找出用户的密码?他不能创建一个彩虹表,因为它需要很长时间(散列密码需要时间,散列哈希这么多次需要花费更多的时间),蛮力也是不可能的,所以还剩下什么?

4 个答案:

答案 0 :(得分:6)

  晚上:我没有说bcrypt或PBKDF。

你的问题隐含地尖叫着“我正试图通过模仿他们的方法来使用bcrypt / PBKDF”。然而,重复问题中提出的问题是为什么设计这些新算法而不是简单地重复刷新键X次。

你想要一个简单的答案吗?好的。 X + 1散列轮次比X散列轮次更安全,但只有边缘。您可能会花费一两秒钟来计算服务器上的哈希值,方法是循环$hash = hash('sha512', $hash);但是攻击者会使用Slide Attack将其减少到一小部分时间,而 on最重要的是他们可能会在几个AWS实例,一组图形卡或僵尸网络上并行攻击。

PBKDF和bcrypt使用的方法在很小程度上最小化/否定了幻灯片攻击的影响,而bcrypt做了某种神奇的巫术,阻止它在某种程度上可以并行化。

答案 1 :(得分:2)

由于存在幻灯片攻击,它与cypher / hash rounds的数量无关。看到: http://en.wikipedia.org/wiki/Slide_attack

答案 2 :(得分:0)

由于MD5的编码方式,它总是输出一个长度相同的字符串(例如32个字符)。从本质上讲,这意味着带有“我是一个字符串”的字符串可能与“Whooptydoo”字符串具有相同的哈希值,尽管这是一个非常(以100为幂)的小机会,但它仍然是一个机会。

这也意味着重复计算字符串上的哈希数X次并不会改变它被破解的可能性,因为它不会对它进行更深入的编码。

我希望我能够清楚地解释清楚,如果我遗漏了某些内容,请发表评论。

答案 3 :(得分:0)

我假设您正在讨论散列密码,然后散列散列,散列THAT散列等等。您可以轻松地创建一个彩虹表,只将散列值映射到散列值散列值。

因此,如果HASH(PASSWORD)= H,然后HASH(H)= H1,HASH(H1)= H2,那么一个易于下载的彩虹表可能包含像PASSWORD | H并以这种方式反向查找密码。此外,现在只需要一个看起来像H |的文件H10000也反过来。

所以,你可能会给黑客带来不便。但它并不是“更安全”,因为它只是一条较长的道路,而不是一个更加危险或困难的道路。