7

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

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

4

4 回答 4

7

晚上:我没有说 bcrypt 或 PBKDF。

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

你想要一个简单的答案吗?好的。X+1 次散列比 X 次散列更安全,但只是略微安全。您可能会花一两秒钟的时间通过循环计算服务器上的哈希值,$hash = hash('sha512', $hash);但攻击者将使用滑动攻击将其缩短到一小部分时间,最重要的是,他们可能会并行化跨几个 AWS 实例、显卡场或僵尸网络进行攻击。

PBKDF 和 bcrypt 采用的方法在很大程度上减少/消除了滑动攻击的影响,bcrypt 做了某种魔法巫术,在某种程度上阻止了它的可并行化。

于 2013-09-24T22:01:31.367 回答
2

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

于 2013-09-24T21:23:36.013 回答
0

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

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

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

于 2013-09-24T21:22:38.453 回答
0

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

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

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

于 2013-09-24T21:26:08.040 回答