为什么不直接迭代哈希函数 10,000,000 次


Why not just iterate a hash function 10,000,000 times?

我已经阅读了许多关于SO的文章,关于您应该如何实现密码哈希。而且我已经读到你不应该多次散列密码(嗯,据说它没有多大帮助(。但为什么不呢?如果我迭代散列密码,假设 10,000,000 次(因为用户可以等待 3 秒来完成他的注册,或者我可以通过发送 AJAX 请求来做到这一点(。

那么,攻击者如何窃取我的数据库,即使知道我只是迭代密码 10,000,000 次(最坏的情况(,也有可能找到用户的密码?他无法创建彩虹表,因为这需要很长时间(散列密码需要时间,散列这么多次散列散列需要更多时间(,蛮力也是不可能的,那么还剩下什么呢?

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

你的问题含蓄地尖叫着"我试图通过糟糕地模仿他们的方法来避免不得不使用 bcrypt/PBKDF"。然而,重复问题中提出的问题是设计这些新算法而不是简单地重新散列密钥X次的原因。

你想要一个简单的答案吗?然后:是的。X+1 哈希轮比 X 哈希轮更安全,但只是稍微安全。您可能会花费一两秒钟的时间通过循环来计算服务器上的哈希$hash = hash('sha512', $hash);但是攻击者将使用滑动攻击将其减少到一小部分时间,最重要的是,他们可能会在几个AWS实例(一个图形卡场(中并行化攻击。 或僵尸网络。

PBKDF和bcrypt采用的方法在很大程度上最小化/抵消了滑动攻击的影响,而bcrypt做了某种神奇的巫毒教,在某种程度上阻止了它的并行化。

因为存在滑动攻击,它与密码/哈希轮数无关。看:http://en.wikipedia.org/wiki/Slide_attack

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

这也意味着重复计算字符串上的哈希值 X 次不会改变它被破解的概率,因为它不会比它已经编码得更深。

我希望我解释得足够清楚,如果我错过了什么,请发表评论。

我假设您正在谈论散列密码,然后散列哈希,哈希该哈希等。然后,您可以轻松创建一个彩虹表,该表仅将哈希值映射到哈希值。

因此,如果 HASH(PASSWORD( = H,然后 HASH(H( =

H1,HASH(H1( = H2,依此类推,那么易于下载的彩虹表可以包含类似 PASSWORD |H 并以这种方式反向查找密码。现在,此外,只需有一个看起来像 H |H10000 并反转。

所以,你给黑客带来了不便,也许。但它并不是真正"更安全",因为它只是一条更长的道路,而不是一条真正危险或困难的道路。