關於 MAC 和 HMAC
我正在研究對稱加密場景中的完整性和身份驗證機制。我想提出一些例子,看看我是否明白了這裡的意思:
讓 $ m $ 成為資訊, $ c $ 密文, $ h $ 散列消息和 $ t $ 應用 MAC 產生的標籤。
範例 1:
在這裡,Alice 想向 Bob 發送一條加密消息,提供身份驗證和完整性,但不使用散列函式。雙方就兩個不同的密鑰達成一致, $ k_{1} $ 和 $ k_{2} $ . 愛麗絲申請 $ c=Enc_{k_{1}}(m) $ 併計算 $ t=MAC_{k_{2}}(m) $ . 然後她發 $ c $ 和 $ t $ 給鮑勃。鮑勃申請 $ m=Dec_{k_{1}}(c) $ 並驗證 $ t’=MAC_{k_{2}}(m) $ 將其與愛麗絲的進行比較 $ t $ .
範例 2:
現在,Alice 想向 Bob 發送一條加密消息,但還要對消息進行散列處理 $ m $ 用於計算 MAC(所以 HMAC 進來了)。雙方就兩個不同的密鑰達成一致(再次), $ k_{1} $ 和 $ k_{2} $ . 愛麗絲申請 $ c=Enc_{k_{1}}(m) $ , 計算消息的雜湊值 $ h=H(m) $ 最後計算 $ t=MAC_{k_{2}}(h) $ . 她發 $ c $ 和 $ t $ 給鮑勃。鮑勃現在破譯 $ m=Dec_{k_{1}}(c) $ , 計算雜湊 $ h=H(m) $ 並驗證 MAC $ t’=MAC_{k_{2}}(h) $ 將其與愛麗絲的進行比較 $ t $ .
在 CBC-MAC 的情況下,我已經讀過雙方必須就固定的消息長度達成一致,因為攻擊者可以偽造一個有效的 MAC。使用 HMAC 時這個問題解決了嗎?
你認為這兩個例子安全嗎?我是對還是錯?特別是在最後一個中,雙方都使用帶有 MAC 的雜湊(我對此特別感興趣)。
謝謝。
你的方案有幾個問題:
- 如果使用填充,那麼您的方案可能容易受到填充預言攻擊,這是因為解密發生在 MAC 驗證之前(參見好奇的答案);
- encrypt-and-MAC 不提供機密性,因為您可以清楚地區分與身份驗證標籤相同的明文 $ t $ 也將是相同的(請參閱好奇的答案下方 CodesInChaos 的評論)。
筆記:
- 研究好奇在答案中提供的連結以了解更多潛在問題是個好主意;
- HMAC 是一個特定的構造(僅使用雜湊作為底層原語);它不是hash-then-CBC-MAC;
- CBC-MAC 的問題很容易解決(對於使用 16 字節塊大小的塊密碼,例如 AES),使用基於 CBC-MAC 但不會遇到動態大小輸入的相同問題的 CMAC 結構。