哈希冲突和附加数据

时间:2009-06-15 14:40:08

标签: hash md5 sha1 collision digest

假设我有两个字符串(或字节数组)A和B都具有相同的散列(散列我的意思是MD5或SHA1)。如果我连接它后面的另一个字符串,A + C和B + C也会有相同的哈希H'吗? C + A和C + B会发生什么?

我用MD5对它进行了测试,在我的所有测试中,在最后添加一些内容使得哈希值相同,但在开头附加时却没有。

这总是正确的(对于所有输入)?

这适用于所有(众所周知的)哈希函数吗?如果不是,是否存在(众所周知的)散列函数,其中A + C和B + C不会发生碰撞(而C + A和C + B也不会碰撞)?

(除了MD5(x + reverse(x))和其他构造的东西我的意思)

3 个答案:

答案 0 :(得分:2)

详细信息取决于散列函数H,但通常它们的工作方式如下:

  1. 使用输入块X(例如,512位)
  2. 将输入分解为更小的片段(例如,32位)并根据输入
  3. 更新散列内部状态
  4. 如果有更多输入,请转到步骤1
  5. 最后,将内部状态吐出为哈希值H(X)
  6. 因此,如果A和B发生碰撞,即H(A)= H(B),则在消耗它们之后,散列将处于相同的状态。使用相同的输入C进一步更新状态可以使得到的散列值相同。这解释了为什么H(A + C)有时是H(B + C)。但这取决于A和B的大小如何与输入块大小对齐以及散列如何在内部打破输入块。

    如果C是散列块大小的倍数,则C + A和C + B可以是相同的,但可能不是。

答案 1 :(得分:0)

这取决于哈希函数的完全。此外,您遇到这些碰撞的可能性非常小。

答案 2 :(得分:0)

这里讨论的散列函数通常是加密的(SHA1,MD5)。这些散列函数有一个Avalanche effect - 输出会随着输入的微小变化而急剧变化。

C的前缀和后缀扩展名将有效地延长输入时间。 因此,在输入的前面或后面添加任何内容都应该显着改变有效的哈希输出。

我不明白你是如何进行MD5检查的,这是我的测试。

echo "abcd" | md5sum
70fbc1fdada604e61e8d72205089b5eb

echo "0abcd" | md5sum
f5ac8127b3b6b85cdc13f237c6005d80

echo "abcd0" | md5sum
4c8a24d096de5d26c77677860a3c50e3

你是说你找到了两个具有相同MD5哈希的输入,然后在输入的结尾或开头添加了一些东西,发现最后添加导致与原始输入相同的MD5?

请提供样品测试结果。