计算哪些字符串将具有相同的哈希值

时间:2010-06-30 21:51:44

标签: algorithm hash

使用SHA-1可以确定哪些有限字符串将呈现相等的哈希值?

4 个答案:

答案 0 :(得分:18)

您正在寻找的是Collision Problem的解决方案(另请参阅collision attack)。一个设计良好且功能强大的加密哈希函数是设计的,其目的是尽可能多地模糊数学,以尽可能地解决这个问题。

事实上,良好哈希函数的度量之一是难以发现冲突。 (在其他措施中,反转哈希函数的难度)

应该注意的是,在输入为任意长度的字符串并且输出是固定长度字符串的哈希中,Pigeonhole Principle确保任何给定字符串至少存在一个冲突。但是,找到这个字符串并不容易,因为它基本上需要对基本无限的字符串集进行盲测和检查。

读入理想的散列函数可能很有用。散列函数被设计为

的函数
  • 输入的微小变化会导致输出中的根本性,混乱性变化
  • 将碰撞降至最低
  • 很难或者理想情况下无法撤销
  • 没有任何输入无法获得的散列值(这一点对于加密目的而言非常重要)

理论上的“完美”哈希算法将是一个“随机预言” - 也就是说,对于每个输入,它输出完美随机输出,条件是对于相同的输入,输出将是相同的(这种情况通过魔法,宙斯和小精灵的手,或者人类无法理解或弄清楚的方式来实现)

不幸的是,这几乎是不可能的,最终,根据他们拥有多少这些品质以及在何种程度上,所有哈希都被判定为“强者”。

像SHA1或MD5这样的散列将非常强大,或者在计算上或多或少地找不到(在合理的时间范围内)冲突。最终,您不需要找到无法找到冲突的哈希值。你实际上只需要一个难度大到足以计算成本太高的地方(即发现碰撞的十亿或一万亿年)

由于所有哈希都不完美,人们可以分析它的内部运作,看到数学模式和启发式,并试图找到沿着这种模式的碰撞。这类似于哈希函数%7 ...哈希数字13将是13%7 = 6,89%7 = 5.如果你看到哈希值为3,你可以使用你对模数函数的数学理解来容易发现碰撞(即10) 1 。对我们来说幸运的是,更强大的哈希函数有更多,更难以理解的数学基础。 (理想情况下,这么难以让人无法理解!)

一些数字:

  • 使用数学中固有的模式,查找单个给定SHA-0哈希的冲突需要在全球顶级超级计算机上运行大约13天的计算。
  • 根据一位有用的评论者,可以“快速”生成MD5碰撞,使其不太适合敏感目的。
  • 到目前为止,尚未发现或证明SHA-1的可行或实用/可用的碰撞发现方法,但正如评论中所指出的,已经发现了一些弱点。

这是一个similar SO question,答案比我的要好得多。

1 请注意,虽然这个散列函数对于碰撞来说很弱,但强烈的是它完全不可能向后找并给定一个密钥,如果你的散列是,比如说,4。有无限量(即4,11,18,25 ......)

答案 1 :(得分:5)

答案显然是肯定的,因为至少你可以遍历给定长度的每个可能的字符串,计算所有字符串的哈希值,然后查看哪些是相同的。更有趣的问题是如何快速

进一步阅读:http://en.wikipedia.org/wiki/Collision_attack

答案 2 :(得分:1)

这取决于哈希函数。使用简单的散列函数,它是可能的。例如,如果散列函数只是对字符串的ASCII字节值求和,那么可以枚举给定长度的所有字符串,这些字符串产生给定的散列值。如果散列函数更复杂并且“加密强”(例如,MD5或SHA1),那么理论上它是不可能的。

答案 3 :(得分:1)

大多数哈希都具有加密或近加密强度,因此哈希以非显而易见的方式依赖于输入。专业化的方式是彩虹表,它是输入和散列的预先计算表。因此,强力检查基本上是唯一的方法。