您正在寻找的是Collision Problem 的解决方案(另请参阅collision attack)。 设计了一个设计良好且功能强大的加密哈希函数,目的是尽可能多地混淆数学,以使这个问题尽可能复杂。
事实上,一个好的哈希函数的衡量标准之一是发现冲突的难度。 (在其他措施中,反转哈希函数的难度)
需要注意的是,在输入是任意长度的字符串并且输出是固定长度的字符串的哈希中,Pigeonhole Principle 确保对于任何给定的字符串至少存在一次冲突。然而,找到这个字符串并不容易,因为它需要对基本上无限的字符串集合进行基本上盲目的猜测和检查。
读入理想的散列函数可能很有用。散列函数被设计为以下函数:
- 输入的微小变化会导致输出发生剧烈、混乱的变化
- 冲突减少到最低限度
- 很难或理想情况下不可能逆转
- 没有任何输入无法获得的散列值(这对于加密目的而言意义不大)
理论上的“完美”哈希算法是“随机预言机”——也就是说,对于每个输入,它输出一个完美随机输出,条件是对于相同的输入,输出将是相同的(这个条件由宙斯和小精灵之手通过魔法实现,或者以人类永远无法理解或弄清楚的方式实现)
不幸的是,这几乎是不可能的,最终,所有哈希都被判断为“强”,基于它们拥有多少这些品质以及达到什么程度。
像 SHA1 或 MD5 这样的哈希将非常强大,并且在计算上或多或少不可能找到冲突(在合理的时间范围内)。最终,您不需要找到不可能找到冲突的哈希。实际上,您只需要一个难度足够大以至于计算成本太高(即大约十亿或一万亿年才能找到碰撞)
由于所有哈希值都不完美,因此可以分析其内部工作原理并查看数学模式和启发式方法,并尝试沿着该模式找到冲突。这类似于散列函数为 %7...对数字 13 进行散列运算将是 13%7 = 6、89%7 = 5。如果您看到散列为 3,则可以使用您对模函数的数学理解轻松找到碰撞(即 10)1。对我们来说幸运的是,更强的散列函数具有非常、非常、非常难以理解的数学基础。 (理想情况下,很难,没有人会理解它!)
一些数字:
- 使用数学中固有的模式,在世界顶级超级计算机上运行计算大约需要 13 天,才能找到单个给定 SHA-0 哈希的冲突。
- 根据一位乐于助人的评论者的说法,MD5 冲突可以“快速”地生成,以至于对于敏感用途而言并不理想。
- 到目前为止,还没有发现或证明适用于 SHA-1 的可行或实用/可用的碰撞发现方法,尽管正如 cmets 中指出的那样,已经发现了一些弱点。
这是similar SO question,它的答案比我的聪明得多。
1请注意,虽然这个散列函数对于碰撞来说很弱,但如果你的散列是,它是强大的,它完全不可能向后找到一个给定的键,比如说, 4. 有无限数量(即4, 11, 18, 25...)