消息驗證碼(MAC)也可以稱為消息認證碼。
定義:
消息驗證碼(Message Authentication Code, MAC)是一種用于驗證消息完整性和真實性的密碼學工具。
MAC 無法證明消息來源的唯一性(與數字簽名不同)。
那么如何做到的呢?
消息認證碼的輸入包括任意長度的消息和一個發送者與接收者之間的共享密鑰。輸出固定長度的數據,輸出的數據就是 MAC 值。
消息認證碼和單向散列函數的區別就在有沒有這個共享密鑰。消息認證碼就是利用共享密鑰進行認證的。

MAC 的工作原理、MAC 的生成和驗證流程如下:
-
生成 MAC(發送方)
- 輸入:原始消息(Message) + 共享密鑰(Secret Key)。
- 計算 MAC:通過特定算法(如 HMAC)生成固定長度的標簽(MAC Tag)。
- 發送:將原始消息和 MAC Tag 一起發送給接收方。
-
驗證 MAC(接收方)
- 接收數據:獲取消息和 MAC Tag。
- 重新計算 MAC:使用相同的密鑰和算法對消息重新生成 MAC Tag。
- 比對:
- 一致:消息未被篡改,且由合法發送方生成。
- 不一致:消息可能被篡改,或密鑰錯誤。
認證流程

MAC 的分類
-
基于哈希的 MAC(HMAC)
- 原理:結合哈希函數(如 SHA-256)和密鑰生成 MAC。
- 特點:高效、標準化(RFC 2104),廣泛用于 TLS、JWT 等協議。
-
基于分組密碼的 MAC(如 CMAC)
- 原理:使用分組密碼算法(如 AES)生成 MAC。
- 特點:適合硬件實現,資源受限場景常用。
-
其他類型
- Poly1305:基于模運算的高效 MAC,與 ChaCha20 加密算法配合使用。
- GMAC:基于伽羅華域的 MAC,用于 GCM 加密模式。
認證加密
什么是認證加密?
2000 年以后,人們基于認證的研究更加進一步,產生了認證加密 (AE:Authenticated Encryption,AEAD:Authenticated Encryption with Associated Data)。
認證加密是一種將對稱密碼和消息認證相結合的技術,同時滿足加密性,完整性和認證性三大功能。
為什么需要認證加密?
傳統的數據保護方案通常將加密和完整性驗證分開處理(例如先加密數據,再單獨計算MAC),但這種分離可能引入安全漏洞:
- 加密不驗證完整性:攻擊者可篡改密文,導致解密后得到無意義但看似合法的數據(如填充錯誤)。
- 組合方式錯誤:若加密與MAC的組合順序不當(如先MAC后加密),可能遭受選擇密文攻擊(CCA)。
- 效率低下:分開實現加密和MAC需要兩次計算,增加延遲和資源消耗。
認證加密(AE/ AEAD) 通過將加密和認證原子化整合,從根本上杜絕了上述問題。
認證加密的種類:
-
例如 Encrypt-then-MAC,先用對稱密碼將明文加密,然后計算密文的 MAC 值。Encrypt-and-MAC,將明文用對稱密碼加密,并對明文計算 MAC 值。
-
MAC-then-Encrypt,先計算明文的 MAC 值,然后將明文和 MAC 值同時用對稱密碼加密。(在 HTTPS 中,一般使用 MAC-then-Encrypt 這種模式進行處理。)
-
GCM(Galois/Counter Mode)是一種認證加密方式。GCM 中使用 AES 等 128 位比特分組密碼的 CTR 模式,并使用一個反復進行加法和乘法運算的散列函數來計算 MAC 值。CTR 模式加密與 MAC 值的計算使用的是相同密鑰,所以密鑰管理很方便。專門用于消息認證碼的 GCM 成為 GMAC。GCM 和 CCM (CBC Counter Mode) 都是被推薦的認證加密方式。
MAC的攻擊手段
重發攻擊
竊聽者不直接破解消息認證碼,而是把它保存起來,反復利用,這種攻擊就叫做重放攻擊(replay attack)。
防止重放攻擊可以有 3 種方法:
-
序號:
每條消息都增加一個遞增的序號,并且在計算 MAC 值的時候把序號也包含在消息中。這樣攻擊者如果不破解消息認證碼就無法計算出正確的 MAC 值。這個方法的弊端是每條消息都需要多記錄最后一個消息的序號。 -
時間戳:
發送消息的時候包含當前時間,如果收到的時間與當前的不符,即便 MAC 值正確也認為是錯誤消息直接丟棄。這樣也可以防御重放攻擊。這個方法的弊端是,發送方和接收方的時鐘必須一致,考慮到消息的延遲,所以需要在時間上留下一定的緩沖余地。這個緩沖之間還是會造成重放攻擊的可趁之機。 -
nonce:
在通信之前,接收者先向發送者發送一個一次性的隨機數 nonce。發送者在消息中包含這個 nonce 并計算 MAC 值。由于每次 nonce 都會變化,因此無法進行重放攻擊。這個方法的缺點會導致通信的數據量增加。
密鑰推測攻擊
在消息認證碼(MAC)中,密鑰推測攻擊(Key Guessing Attack) 是一種針對 MAC 密鑰的暴力破解攻擊。攻擊者通過已知的明文-標簽對(Message-Tag Pair),嘗試猜測生成 MAC 的密鑰,從而偽造合法標簽,破壞 MAC 的安全性。
密鑰推測攻擊的原理
-
攻擊目標:
通過已知的明文 ( M ) 和對應的 MAC 標簽 ( T ),逆向推導出生成 ( T ) 的密鑰 ( K )。
公式:$ ( T = \text{MAC}(K, M) \rightarrow \text{求 } K ) $。 -
攻擊方式:
- 暴力窮舉:嘗試所有可能的密鑰 ( K' ),計算 $ ( \text{MAC}(K', M) ) $ ,直到 $ ( \text{MAC}(K', M) = T )$ 。
- 字典攻擊:使用預生成的常用密鑰字典(如弱密碼庫),加速猜測過程。
-
攻擊前提:
- 攻擊者至少掌握一個有效的明文-標簽對 ( (M, T) )。
- MAC 算法的密鑰空間較小(如密鑰長度過短)。
密鑰推測攻擊的核心威脅在于弱密鑰或短密鑰的脆弱性。
消息認證碼無法解決的問題
消息認證碼雖然可以證明雙方發送的消息是一致的,沒有篡改,也不存在中間人偽裝。但是它無法 “對第三方證明” 和 “防止抵賴”。
-
無法 “對第三方證明” 原因是因為消息認證碼中用到的密鑰是共享密鑰,通信雙方都有這個密鑰,所以對第三方無法證明消息到底出自雙方中的哪一方。(解決 “第三方證明” 的問題需要用到數字簽名)
-
無法 “防止抵賴” 原因是也是因為消息認證碼的共享密鑰雙方都有,無法判斷消息是發自于哪一方。所以消息認證碼無法防止否認(nonrepudiation)。(解決 “防止抵賴” 的問題需要用到數字簽名)
浙公網安備 33010602011771號