MD5校驗會有極低的碰撞率,那麼經過MD5之後產生的16個位元組再次進行MD5運算會不會進一步降低碰撞率?

這個原理應該跟HMAC-md5一樣吧?


不會。

考慮兩個Hash鏈

egin{align}
h(a_0)=a_1 longrightarrow h(a_1) = a_2  longrightarrow h(a_2)=a_3  longrightarrow  h(a_3) = a_4 cdots  h(a_{n-1})=a_n \
h(b_0)=b_1 longrightarrow h(b_1) = b_2  longrightarrow h(b_2)=b_3  longrightarrow  h(b_3) = b_4 cdots  h(b_{n-1})=b_n
end{align}

把h視為MD5的話,找MD5碰撞相當於在a0,b0處找出一個碰撞,設這個碰撞率為p。

而在HMAC結構或多輪MD5下(此處簡化key的影響),為了找一個衝突,只需要找到這麼一個i, 使得

h(a_i) = h(b_i)

即可,這個衝突概率,邏輯上來表示是

egin{align}
 Pr[h(a_0) = h(b_0) vee h(a_1) = h(b_1) vee h(a_2) = h(b_2) vee cdots h(a_{n-1}) = h(b_{n-1})] \
 geq Pr[h(a_0) = h(b_0)] \
 = p
end{align}

所以,多次進行MD5,被碰撞成功的概率至少和碰撞一次MD5的概率相等(這是下界)。

另外,下面是對多輪Hash的碰撞率的上界的一個估計,

egin{align}
 Pr[h(a_0) = h(b_0) vee h(a_1) = h(b_1) vee h(a_2) = h(b_2) vee cdots h(a_{n-1}) = h(b_{n-1})] \
 leq Pr[h(a_0) = h(b_0)] +Pr[h(a_1) = h(b_1)] + cdots + Pr[h(a_{n-1} ) = h(b_{n-1})] +\
 =n * p
end{align}

, n為輪數或者HMAC所用的block數。


沒有任何的關係。

假設A和B兩個消息是碰撞的,那麼第一輪的結果就已經一樣了,你第二輪無論如何也是一樣的結果。

從數學上,你這樣處理只會增加碰撞率而不是減少。

HMAC的做法也不是這樣。我也強調過HMAC對於密碼學意義上的碰撞應該是沒有太大意義的,只是在網路安全協議的碰撞上有一定貢獻。

MD5的碰撞率是可以忽略的,我認為如果你只是使用密碼學演算法,而不是真正在研究它,這個問題不要關心。

我個人建議你用SHA256代替,如果你有心,bcrypt等演算法能提供更高的安全性。除非你是國防用途,否則這兩者應該是足夠了


碰撞就是指不同內容的hash值正好相同,那麼相同的16位元組再md5當然是也是相同的了

其實我倒是一直在想一種加強機制,也不知道有沒有人驗證過:

如果同時採用md5和crc32,會不會碰撞的難度就大很多?


沒有任何關係,舉個簡單的例子

"兩次投擲硬幣"


推薦閱讀:

MD5 加密不是單向的嗎? 那為什麼網上還有在線 MD5 破解呢?
先用md5,再用sha1,這樣密碼會安全一點嗎?
為什麼現在網上有很多軟體可以破解MD5,但MD5還是很流行?
有哪些值得推薦的 MD5 在線解密網站?

TAG:網路安全 | 密碼 | 密碼加密 | MD5 |