了解雜湊衝突 - 為什麼不好?
我讀了幾個關於這個問題的答案:為什麼雜湊衝突如此危險?但並沒有得到真正令人滿意的答案。假設我們是第一個發現 SHA256 衝突的人,比如
sha256($§"%fa7asd8ft6sds) = sha256(889=?`/&&%“HSF)
(這不是一個真正的等式,但假設它是真的)。
為什麼這很危險?為什麼SHA256現在壞了?我如何從中獲得更多的碰撞?也許更重要的碰撞像 sha256(Send me 5€) = sha256(Send me 5000€ &%$"§"%§%…)
首先,密碼散列衝突不是通過搜尋或偶然發現的。它們被計算是因為 - 由於某種原因 - 散列算法被破壞了。你仍然需要創建關於 $ 2^{128} $ 畢竟,即使您將生日綁定在其中,也要使用雜湊來查找碰撞 - 並記住您也必須執行比較,儘管有一些技巧可以加快速度。
相反,執行分析的團隊會發現一個弱點並加以利用,有時需要大量資源。這也意味著,如果您創建了一個碰撞,您可能能夠使用相同的方法創建更多的碰撞。
如果相對少量的內部狀態受到影響,則可以修復散列 - 例如,加固的 SHA-1 可以防止 SHAttered 攻擊。當然,既然 SHA-1 被證明很弱,那麼無論如何都有充分的理由遷移到例如 SHA-256,而且我還沒有看到任何地方都採用了強化的 SHA-1。
即使您只有兩個輸入生成相同的雜湊值,您也可能會遇到麻煩。雜湊在內部逐塊操作。如果有可能找到碰撞,那麼接下來的塊也將是易受攻擊的。換句話說,如果你發現 $ H’(B_1) = H’(B_2) $ 然後 $ H’(B_1 | E) = H’(B_2 | E) $ 在哪裡 $ | $ 是串聯。請注意,副檔名 $ E $ 可能包含任何數據。所以從這個意義上說:如果您發現 SHA-256 的一次沖突,那麼您會發現許多以特定數據塊或數據塊開頭的消息衝突。
對於 SHA-3,情況稍微複雜一些(這取決於內部狀態 - 即使用過的海綿的容量 - 在最終操作之前或之後是否相同),但基本上你仍然會遇到麻煩。
如果這些衝突適用於您的協議是另一個問題。依賴散列函式的 HMAC 等方案完全不受影響,因為它不需要配置的散列函式的抗衝突性。