题
假设我有两个字符串(或字节数组)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))
和我的意思是其他构造的东西)
解决方案
这取决于的完全在散列函数。同样,你有这些冲突的概率是非常小的。
其他提示
细节取决于哈希函数 H,但通常它们的工作原理如下:
- 使用输入 X 块(例如 512 位)
- 将输入分成更小的部分(例如 32 位)并根据输入更新哈希内部状态
- 如果还有更多输入,请转至步骤 1
- 最后将内部状态吐出为哈希值H(X)
所以,如果 A 和 B 碰撞,即H(A) = H(B),消耗它们后哈希将处于相同的状态。使用相同的输入 C 进一步更新状态可以使生成的哈希值相同。这解释了为什么 H(A+C) 有时是 H(B+C)。但这取决于 A 和 B 的大小如何与输入块大小对齐以及哈希如何在内部破坏输入块。
如果 C 是哈希块大小的倍数,则 C+A 和 C+B 可以相同,但否则可能不同。
被这里讨论的散列函数通常是加密(SHA1,MD5)。这些散列函数有一个雪崩效应 - 输出将与一个细微的变化发生急剧变化输入。
C
的前缀和后缀扩展将有效地使一个较长的输入。
所以,增加任何内容到前部或后部的输入应该显著改变有效散列输出。
我不明白你是怎么做到的MD5校验,这里是我的测试。
echo "abcd" | md5sum
70fbc1fdada604e61e8d72205089b5eb
echo "0abcd" | md5sum
f5ac8127b3b6b85cdc13f237c6005d80
echo "abcd0" | md5sum
4c8a24d096de5d26c77677860a3c50e3
你是说,你位于两个输入其有相同的MD5哈希值,然后附加一些东西到输入的结束或开始后发现,在末处加入导致相同的MD5作为原始输入?
请提供样品与测试结果。