Hash

MAC 雙重雜湊是否足以防止長度擴展攻擊?

  • October 13, 2020

我知道 $$ mac=\operatorname{SHA1}(secret\mathbin|message) $$

很容易受到長度擴展攻擊,但是呢:

$$ mac=\operatorname{SHA1}(\operatorname{SHA1}(secret\mathbin|message))? $$

為了讓某人進行長度擴展攻擊,他們是否必須暴力破解秘密或暴力破解初始 $ \operatorname{SHA1} $ 本身?(第一個對於一個好的秘密應該是不可行的,而第二個應該和僅僅暴力破解新雜湊本身一樣昂貴,甚至可能更昂貴?)

(編輯:最初在這裡也有關於 HMAC 的第二個問題,但我想我會在一個單獨的執行緒中提出這個問題,對於評論中的混淆感到抱歉)

$$ mac=\operatorname{SHA1}(\operatorname{SHA1}(secret\mathbin|message)) $$

mac 雙重雜湊是否足以防止長度擴展攻擊?

雙重雜湊是由Ferguson 和 Schneier 在他們的書 Practical Cryptography 第 6.3.1 章中定義的, 以再次對抗長度擴展攻擊(以及比特幣中使用的 SHA256D)。他們書中的細節,我沒有副本。因此,我們可以假設它對長度擴展攻擊具有抵抗力。或者,可以給出一個簡單的論點:

要執行長度擴展攻擊,攻擊者需要產生$$ mac=\operatorname{SHA1}(\operatorname{SHA1}(secret\mathbin|message|pad\mathbin|message_2\mathbin|pad_2)) $$但他們只能控制 $ h $ 並且實際的長度擴展攻擊可以像這樣在外部呼叫上起作用

$$ mac=\operatorname{SHA1}(\operatorname{SHA1}(secret\mathbin|message|pad)\mathbin|message_2\mathbin|pad_2) $$. 甚至攻擊者可以偽造mac(即結果相同)它會失敗,因為它不起作用。

為了讓某人進行長度擴展攻擊,他們不是必須暴力破解秘密還是暴力破解初始 SHA1 本身嗎?(第一個對於一個好的秘密應該是不可行的,而第二個應該和僅僅暴力破解新雜湊本身一樣昂貴,甚至可能更昂貴?)

因此,您想將其用作Message Authentication Code (MAC)。如果秘密至少為 128 位,則無法暴力破解秘密。

此處的蠻力初始被稱為原像攻擊,它被賦予一個雜湊值 $ h $ 找到輸入 $ x $ 這樣 $ h=H(x) $ ( 或者 $ h=H(H(x)) $ )。通用原像攻擊的代價是 $ \mathcal{O}(2^n) $ 在哪裡 $ n $ 是散列函式的輸出大小 $ h $ . 對於 SHA-1,這使得 $ \mathcal{O}(2^{160}) $ . SHA-1在原像電阻中破碎但未損壞。因此前像攻擊是不可行的。實際上,原像攻擊並不能保證返回用於創建雜湊值的實際消息。那裡也可能失敗。

據我所知,這種結構沒有安全證明作為安全 MAC。在上層有一個廣泛的答案 $ H(k\mathbin|H(k\mathbin|m)) $ .

相反,使用經過驗證的;HMAC-SHA256,或帶有SHA3的新版本;克馬克。由於 SHA3 對長度擴展攻擊具有抵抗力,因此 KMAC 的建構要容易得多。

SHA3​​設計使前綴構造 $ H(k\mathbin|m) $ 一個安全的 PRF,並帶有內置的 PRF 模式,即密鑰 KMAC。帶有一個將 PRF 的安全性與原語聯繫起來的定理。

另外,請注意,SHA2系列的修剪版本還可以抵抗 SHA-512/256 等長度擴展攻擊。修剪防止添加擴展消息和填充以繼續散列。如果修剪> 120,則必須猜測/嘗試修剪的數量。


更新:我查看了本書第 6.4 節。事實證明,他們在新書中提出了兩種方法和一種新方法。

  1. 提議正在替換 $ m \to h(m) $ 和 $ m \to h(h(m)\mathbin|m)) $ . 他們定義了 $ h_{DBL} := h(h(m)\mathbin|m)) $

他們認為,如果 $ h $ 是一個安全的密碼散列函式 $ n $ nit 輸出,則它具有安全級別 $ n $ . 這很慢,您需要將整個消息發送兩次。 2. 提議是雙重雜湊 $ h(h(m)) $ 只聲稱它有 $ min(k,n/2) $ 在哪裡 $ k $ 是安全級別 $ h $ 和 $ n $ 是輸出大小。 3. 提案在新書Cryptography Engineering: Design Principles and Practical Applications 1st Edition

$$ h_d := h(h(0^b\mathbin|m) $$

並聲稱它有 $ min(k,n/2) $ 在哪裡 $ k $ 是安全級別 $ h $ 和 $ n $ 是輸出大小。

引用自:https://crypto.stackexchange.com/questions/84481