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

goo*_*ing 5 php passwords hash

我已经阅读了很多关于SO如何实现密码哈希的文章。而且我读到,您不应该多次对密码进行哈希处理(嗯,据说这样做没有太大帮助)。但是为什么不呢?如果我迭代哈希密码,可以说是10,000,000次(因为用户可以等待3秒才能完成注册,或者我可以通过发送AJAX请求来完成此操作)。

那么,攻击者如何窃取我的数据库,甚至知道我只对密码进行10,000,000次迭代(最坏的情况),也可能发现用户的密码?他无法创建彩虹表,因为这将花费他很长时间(哈希密码需要时间,而哈希哈希需要很多次则需要更多时间),强力破解也不可能,那么还剩下什么呢?

Sam*_*tch 6

傍晚:我没有说关于bcrypt或PBKDF的任何事情。

您的问题隐含地尖叫:“我正试图通过不良地模仿bcrypt / PBKDF的方法来摸索自己的方式”。但是,重复问题中提出的问题是设计这些新算法而不是简单地将哈希键重新哈希X次的原因。

您想要一个简单的答案?好的。X + 1散列轮不仅仅是X散列轮更安全,但只有轻微如此。您可能需要花一两秒钟的时间来遍历服务器上的哈希,$hash = hash('sha512', $hash);但攻击者将使用“ 滑动攻击”将其减少到一小部分时间,最重要的是,它们可能会并行化攻击几个AWS实例,一组图形卡或一个僵尸网络。

PBKDF和bcrypt所采用的方法在最小化/消除滑行攻击的影响方面有相当大的方法,而bcrypt则做了某种魔术伏都教,使它在某种程度上无法并行化。