MAC 與 HMAC 與 PRF 之間的區別
我對 MAC、HMAC 和 PRF 之間的區別以及何時使用哪個術語有些困惑。
如果函式是使用如下所示的散列和密鑰計算的,這是 HMAC 還是 MAC?
MD5(master_secret + pad2 + MD5(handshake_messages + Sender + master_secret + pad1));
如果我有一個用於驗證數據的標籤,使用以下形式的 PRF 計算:
PRF(master_secret, finished_label, Hash(handshake_messages))
再一次,我的問題是,這是 HMAC 還是 MAC 還是沒有,只是一個 PRF?
上述函式分別用於 SSL 3.0 和 TLS 1.2 的 Finished 消息。文獻中普遍使用MAC。我不確定這是否是用來指代他們的正確術語。
我可以通過 MAC 參考 HMAC 和 PRF 嗎?
PRF或偽隨機函式族是函式族 $ F_k\colon {0,1}^n \to {0,1}^m $ 這樣如果 $ k $ 是均勻分佈的,那麼 $ F_k $ 似乎均勻分佈在所有功能中 $ G\colon {0,1}^n \to {0,1}^m $ . 一個PRF $ F_k $ 如果不知道密鑰的對手是安全的 $ k $ 無法區分 $ F_k $ 從函式的統一隨機選擇 $ G\colon {0,1}^n \to {0,1}^m $ 除了擲硬幣之外,成功的可能性幾乎可以忽略不計——對手的唯一策略是正確猜測關鍵 $ k $ 它通常是從通常的空間中均勻繪製的 $ 2^{128} $ 或者 $ 2^{256} $ 任何對手都不會偶然發現的可能性。
PRF的存在仍然是一個猜想,與P = NP有關;充其量我們推測函式族是 PRF,有時會找到猜想的反例。一些 PRF 具有長或可變長度輸入,例如鍵控 BLAKE2b;一些 PRF 的輸入很短,例如ChaCha 或 MD5 中的壓縮函式。
MAC或消息驗證碼是一系列函式 $ M_k\colon {0,1}^* \to {0,1}^T $ 用它可以構造和驗證一個 $ T $ 位標記 $ t = M_k(m) $ 在一條消息上 $ m $ 用密鑰 $ k $ . 如果對手看到一些過去(可能是自適應地)選擇的消息和標籤,則 MAC 是安全的 $ (m_i, t_i) $ 和 $ t_i = M_k(m_i) $ , 不能偽造標籤 $ t’ = M_k(m’) $ 留言 $ m’ $ 以前從未見過的機率大於可忽略的機率。
許多 MAC 是一次性驗證器,這意味著密鑰只能用於一條消息,例如 Poly1305 和 GHASH(屬於 AES-GCM)。一次性驗證器非常有用,因為它們速度極快,並且可以提供偽造機率的無條件資訊論安全證明,並且很容易使用帶有 nonce 的 PRF 為每條消息創建一個新的 OTA 密鑰。
長輸入 PRF $ F_k $ 也可以用作 MAC,因為對手已經看到 $ {F_k(m_i)}i $ 甚至無法區分 $ {G(m_i)}i $ 對於一個統一的隨機選擇 $ G $ ,所以對手的最佳策略是挑選一些 $ k’ $ 均勻隨機,嘗試鍛造 $ t’ = M{k’}(m’) $ 對於一些消息 $ m’ $ ,並希望 $ k = k’ $ ,其成功機率受以下機率限制 $ M{k’}(m’) $ 恰巧與 $ M_k(m’) $ 或者那個 $ k = k’ $ ,兩者都可以忽略不計。
$ \newcommand{\concat}{\mathop{\Vert}} $ HMAC是一個長輸入 PRF 的特定結構,它來自於 Merkle-Damgård 結構中連結的短輸入 PRF $ H $ ,例如 MD5 或 SHA-256。天真地使用函式
$$ F_k\colon m \mapsto H(k \concat m) $$用於統一隨機密鑰 $ k $ 不給出 PRF 時 $ H $ 是 MD5、SHA-1、SHA-256 或 SHA-512,因為即使我不知道 $ k $ , 知道 $ F_k(m) $ 使我能夠輕鬆計算 $ F_k(m \concat p \concat m’) $ 一些填充 $ p $ 和任意後綴 $ m’ $ . 這稱為長度擴展攻擊。HMAC 為 MD 散列函式解決這個問題 $ H $ 通過使用$$ F_k\colon m \mapsto H\bigl((\mathrm{opad} \oplus k) \concat H\bigl((\mathrm{ipad} \oplus k) \concat m\bigr)\bigr), $$在哪裡 $ \mathrm{opad} $ 和 $ \mathrm{ipad} $ 是標準中定義的常量字元串。 (完整的細節很挑剔,例如,如果 $ k $ 不完全是底層短輸入 PRF 的一個塊的長度 $ H $ . 您也可以在非 MD 函式(如 SHA-3)上使用 HMAC,但 HMAC 安全性降低的通常參考依賴於 MD。HMAC 的安全性降低故事很複雜,最近有一些關於它的工作;然而,像 SHA-3 和 BLAKE2 這樣的現代設計的策略是只使用前綴鍵控 $ F_k\colon m \mapsto H(k \concat m) $ 作為一個沒有 HMAC 扭曲的 PRF 工作,並定義該函式的標準域分隔鍵控 PRF 變體。)
因為對於某些固定的散列函式 $ H $ , HMAC- $ H $ 被推測為 PRF,並且由於 PRF 總是生成 MAC,因此可以使用 HMAC- $ H $ 製作一個(相當慢的)MAC。
您的構造是用於某些固定散列函式的 HMAC $ H $ ? 不。
你的建築是PRF嗎?否:如果對手可以控制 $ \mathrm{handshake_messages} $ ,那麼他們幾乎可以肯定地在
$$ \operatorname{MD5}(\mathrm{handshake_messages} \concat \mathrm{Sender} \concat \mathrm{master_secret} \concat \mathrm{pad}_1), $$這將使他們能夠區分 $ F_k $ (你的建築)從一個統一的隨機 $ G\colon {0,1}^\ell \to {0,1}^T $ 不知道 $ k $ ( $ \mathrm{master_secret} $ ) 通過簡單地在衝突消息上評估它並查看它是否相同,這對於絕大多數功能 $ G $ 不會是這樣。 你的建築是MAC嗎?同樣,不,因為如果對手可以找到一對沖突的握手消息集,那麼他們可以要求您在其中一個上製作標籤,然後他們可以使用相同的標籤在另一個上製作偽造品。
這是否意味著您可以在實踐中立即攻擊以這種方式工作的系統?也許,也許不是。這意味著加密不是由可靠且易於理解的部分設計而成,這些部分可以讓人們對整個系統的安全性充滿信心。因此,要了解整個系統的安全性,您不能簡單地 (a) 評估元件的安全性,以及 (b) 評估它們連接方式的安全性;您必須將整個事物評估為一個巨大的單位頭髮球。大多數密碼學家和審計員都不想這樣做,因為這比做得好的密碼工程要多得多。