假设H是一些哈希函数(例如MD5或SHA256或其他),我对此哈希有一个冲突:两个不同的数据x和y,它们具有相同的哈希值。
换句话说,x≠y但H(x)= H(y)。
现在,如果我连接一些随机数据z,H(x + z)是否与H(y + z)相同?
这个想法是:x和y是一个碰撞可能意味着它们碰巧使H函数处于相同的状态(从而导致相同的散列)。从那时起,我们附加的其他数据无关紧要,它们的哈希值将保持不变。
我测试了上面的this MD5 collision,它似乎在那里工作。但我不知道这一般是否属实?
答案 0 :(得分:1)
这种特殊技术称为length extension attack。散列函数是否易受攻击显然取决于特定的散列函数。基于Merkle–Damgård construction的哈希函数(如MD5和SHA-1)容易受到攻击。 SHA-3不易受攻击,HMAC constructions也不容易受到攻击。
答案 1 :(得分:0)
取决于has功能。由于哈希函数不是homomorphic(即,f(x) = f(y)
暗示x = y
),因此f(x + z)
和f(y + z)
将映射到同一地方项目。考虑一个反例:
给出哈希函数
f(x) = (x * 3) + 1 mod 6
然后f(2) = 1
和f(6) = 1
。让z = 1
。然后:
f(2 + z) = 4 and f(6 + z) = 1
因此f(2) = f(6)
但f(2 + z) ≠ f(6 + z)
。
但是,如果哈希函数是同态的,那么根据同态的定义:
f(p + q) = f(p) + f(q)
因此:
f(x + z) = f(x) + f(z)
f(y + z) = f(y) + f(z)
除了你最初说过的f(x) = f(y)
之外:
f(x) + f(z) = f(y) + f(z)
所以他们的哈希会是一样的。
答案 2 :(得分:0)
(请放纵,这是我的第一个回答:D) 不一定:
考虑以下数据(作为数字列表)
x = [8 0 4]
y = [8 1 0]
z = [5]
和散列函数:
H([a b c]) = a + b*c
H([a b c d]) = H([b c d]) + H([a b c])
然后,x和y发生碰撞:
H(x) = H([8 0 4]) = 8 + 0*4 = 8
H(y) = H([8 1 0]) = 8 + 1*0 = 8
但是在追加数据时,哈希值不相等:
H(z + x) = H([5 8 0 4]) = H([5 0 8]) + H([8 0 4]) = 5 + 8 = 13
H(z + y) = H([5 8 1 0]) = H([5 8 1]) + H([8 1 0]) = 13 + 8 = 21