使用 SHA-256 進行無密鑰完整性檢查
目前,一個程序正在從一個不可靠的來源(例如 CDN)載入一些可能已被篡改的文件。它具有本地儲存的文件的已知 SHA-256 雜湊值,然後它從 CDN 下載文件並在將文件載入到記憶體之前比較雜湊值。
因為大多數 SHA2 系列都遭受長度擴展攻擊(截斷版本除外),所以這個 SHA-256 雜湊似乎不足以檢查來自不可靠來源的文件的完整性。聰明的攻擊者可以在下載的文件中嵌入一些額外的數據,程序會接收文件,將其計算為相同的 SHA-256 雜湊,無意中執行該程式碼並破壞程序。
該程序的原始碼是公開的,因此為 HMAC 嵌入密鑰不是一種選擇,而且無論如何都會太慢。SHA3 庫程式碼目前也不可用。但是,SHA-384 雜湊不易受到長度擴展攻擊。下一個最佳選擇是使用 SHA-384 進行完整性檢查嗎?它也符合 NSA 最近的建議,即至少使用 SHA-384。
長度擴展攻擊不會讓您發現衝突。它使您可以預測前綴中具有未知組件的輸入的雜湊值。如果你有 $ h = H(x) $ 對於未知(或部分未知) $ x $ , 你可以生成 $ h_y = H(x \vert\vert y) $ 對於任意 $ y $ (這並不完全正確;我忽略了填充,但出於討論的目的,這是一個小細節)。然而,你還是找不到 $ z $ 這樣 $ h = H(x \vert\vert z) = H(x) $ 比蠻力還快。
使用 SHA-256 或任何抗衝突雜湊,沒有已知的攻擊(包括長度擴展)允許生成與原始文件不同且具有與原始文件相同的雜湊的文件,即使對手可以選擇原始文件。
即使使用實際損壞的 MD5 或損壞的 SHA-1,也沒有已知的攻擊(包括長度擴展、各種衝突和像 Flame 中那樣的選擇前綴衝突)允許生成與原始文件不同且具有相同雜湊的文件作為原件,如果有:
- 原始文件的設計不允許對其任何部分進行攻擊;
- 原始文件在文件的一部分中包含一些攻擊者無法預測的內容,該部分比任何可能被精心設計以允許攻擊的部分更早。
從 2 開始,如果基於 MD5 或 SHA-1 的證書在開始時包含請求者無法預測的序列號,則仍然可以免受任何已知的攻擊。