我已经阅读了很多关于如何实现密码散列的帖子。而且我读到你不应该多次对密码进行哈希处理(好吧,据说这没什么帮助)。但为什么不呢?如果我重复哈希密码,比方说,10,000,000 次(因为用户可以等待 3 秒来完成他的注册,或者我可以通过发送 AJAX 请求来做到这一点)。
那么,攻击者如何窃取我的数据库,甚至知道我只是将密码重复 10,000,000 次(最坏的情况),怎么可能找出用户的密码?他无法创建彩虹表,因为这会花费他很长时间(散列密码需要时间,而多次散列散列需要更多时间),暴力破解也不太可能,所以还剩下什么?
evening: I wasn't saying anything about bcrypt or PBKDF.
你的问题含蓄地尖叫着“我试图通过拙劣地模仿他们的方法来绕过必须使用 bcrypt/PBKDF 的方法”。但是,重复问题中提出的问题是设计这些新算法而不是简单地将 key 重新散列 X 次的原因。
你想要一个简单的答案?好的。 X+1 轮哈希比仅 X 轮哈希更安全,但勉强如此。您可能会花一两秒钟通过遍历 $hash = hash('sha512', $hash);
来计算服务器上的哈希值,但是攻击者将使用 Slide Attack将时间减少到一小部分,最重要的是他们可能会在几个 AWS 实例、图形卡农场或僵尸网络之间并行进行攻击。 p>
PBKDF 和 bcrypt 采用的方法在很大程度上减少/消除了滑动攻击的影响,并且 bcrypt 做了某种魔法巫术,在某种程度上阻止了它的并行化。