使用SHA-1可以确定哪些有限字符串将呈现相等的哈希值?
答案 0 :(得分:18)
您正在寻找的是Collision Problem的解决方案(另请参阅collision attack)。一个设计良好且功能强大的加密哈希函数是设计的,其目的是尽可能多地模糊数学,以尽可能地解决这个问题。
事实上,良好哈希函数的度量之一是难以发现冲突。 (在其他措施中,反转哈希函数的难度)
应该注意的是,在输入为任意长度的字符串并且输出是固定长度字符串的哈希中,Pigeonhole Principle确保任何给定字符串至少存在一个冲突。但是,找到这个字符串并不容易,因为它基本上需要对基本无限的字符串集进行盲测和检查。
读入理想的散列函数可能很有用。散列函数被设计为
的函数理论上的“完美”哈希算法将是一个“随机预言” - 也就是说,对于每个输入,它输出完美随机输出,条件是对于相同的输入,输出将是相同的(这种情况通过魔法,宙斯和小精灵的手,或者人类无法理解或弄清楚的方式来实现)
不幸的是,这几乎是不可能的,最终,根据他们拥有多少这些品质以及在何种程度上,所有哈希都被判定为“强者”。
像SHA1或MD5这样的散列将非常强大,或者在计算上或多或少地找不到(在合理的时间范围内)冲突。最终,您不需要找到无法找到冲突的哈希值。你实际上只需要一个难度大到足以计算成本太高的地方(即发现碰撞的十亿或一万亿年)
由于所有哈希都不完美,人们可以分析它的内部运作,看到数学模式和启发式,并试图找到沿着这种模式的碰撞。这类似于哈希函数%7 ...哈希数字13将是13%7 = 6,89%7 = 5.如果你看到哈希值为3,你可以使用你对模数函数的数学理解来容易发现碰撞(即10) 1 。对我们来说幸运的是,更强大的哈希函数有更多,更难以理解的数学基础。 (理想情况下,这么难以让人无法理解!)
一些数字:
这是一个similar SO question,答案比我的要好得多。
1 请注意,虽然这个散列函数对于碰撞来说很弱,但强烈的是它完全不可能向后找并给定一个密钥,如果你的散列是,比如说,4。有无限量(即4,11,18,25 ......)
答案 1 :(得分:5)
答案显然是肯定的,因为至少你可以遍历给定长度的每个可能的字符串,计算所有字符串的哈希值,然后查看哪些是相同的。更有趣的问题是如何快速 。
答案 2 :(得分:1)
这取决于哈希函数。使用简单的散列函数,它是可能的。例如,如果散列函数只是对字符串的ASCII字节值求和,那么可以枚举给定长度的所有字符串,这些字符串产生给定的散列值。如果散列函数更复杂并且“加密强”(例如,MD5或SHA1),那么理论上它是不可能的。
答案 3 :(得分:1)
大多数哈希都具有加密或近加密强度,因此哈希以非显而易见的方式依赖于输入。专业化的方式是彩虹表,它是输入和散列的预先计算表。因此,强力检查基本上是唯一的方法。