为啥不将哈希函数迭代 10,000,000 次? [复制]

Posted

技术标签:

【中文标题】为啥不将哈希函数迭代 10,000,000 次? [复制]【英文标题】:Why not just iterate a hash function 10,000,000 times? [duplicate]为什么不将哈希函数迭代 10,000,000 次? [复制] 【发布时间】:2013-09-30 07:03:33 【问题描述】:

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

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

【问题讨论】:

因为哈希返回一个简单的字母数字字符串这一事实会在重新哈希时减少附加向量 你只会得到很多冗余数据。使用 bcrypt 或 password_hash (php 5.5)。 @Dagon:我认为问题不一样...... 我认为答案 @MrJack:这样更好,不是吗?现在攻击者有多个密码可供用户使用。 【参考方案1】:

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

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

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

【讨论】:

我当然希望我正确理解了这个问题。【参考方案2】:

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

【讨论】:

幻灯片攻击是对具有弱密钥调度的分组密码的攻击,以恢复密钥。它与密码哈希无关。【参考方案3】:

我假设您正在讨论对密码进行哈希处理,然后对哈希进行哈希处理、对 THAT 哈希进行哈希处理等。然后您可以轻松地创建一个彩虹表,将哈希值映射到哈希值。

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

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

【讨论】:

【参考方案4】:

晚上:我没有说 bcrypt 或 PBKDF。

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

您想要一个简单的答案吗?好的。 X+1 轮哈希比 X 轮更安全,但只有略微如此。您可能会花一两秒钟的时间通过循环 $hash = hash('sha512', $hash); 来计算服务器上的哈希值,但攻击者会使用 Slide Attack 将其缩短到一小部分时间,除此之外 他们可能会在几个 AWS 实例、一个显卡场或一个僵尸网络上并行攻击。

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

【讨论】:

感谢您的回答。其实我不是kludging my way around to use bcrypt,我只是好奇。 幻灯片攻击是对具有弱密钥调度的分组密码的攻击,以恢复密钥。它与密码哈希无关。

以上是关于为啥不将哈希函数迭代 10,000,000 次? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 cProfile 只运行一次代码?

我需要一些指导来编写哈希函数来对 ~160,000 个字符串进行排序

为啥我的基于 Alexnet 的 CNN 分类失败?

关联函数 map 的基本用法

xts 函数不将我的 POSIXct 日期视为适当的基于时间的对象

对 C++ 哈希表有一个好的哈希函数吗?