跳到主要內容

HMAC 深入解析:結合密鑰與雜湊函數,打造資料完整性與來源驗證的核心機制

什麼是 HMAC?

在數位通訊中,光有雜湊不夠——攻擊者也能重新計算雜湊值。HMAC(Hash-based Message Authentication Code)透過將「共享密鑰」注入雜湊運算,同時保證資料完整性與來源可信度。

運作原理

HMAC 的核心公式為 HMAC(K, M) = H((K ⊕ opad) ∥ H((K ⊕ ipad) ∥ M)),其中 K 為密鑰、M 為訊息、H 為底層雜湊函數(如 SHA-256)。密鑰分別與內層填充(ipad)和外層填充(opad)進行 XOR,再執行兩次雜湊運算。這種雙層結構有效抵禦長度延伸攻擊(Length Extension Attack)。最終輸出的摘要即為 MAC,只有持有相同密鑰的一方才能重現相同結果,從而完成驗證。

Python 實作範例

import hmac, hashlib

key = b"secret-key"
message = b"user_id=42&amount=1000"

mac = hmac.new(key, message, hashlib.sha256).hexdigest()
print(mac)  # 驗證時重新計算並比對此值

常見應用場景

HMAC 是現代安全基礎設施的基石,廣泛應用於多個關鍵場景。HOTP/TOTP(一次性密碼)使用 HMAC-SHA1 對計數器或時間戳產生動態驗證碼,是 Google Authenticator 等 2FA 工具的核心。TLS 握手協議利用 HMAC 驗證握手訊息的完整性,防止中間人竄改。API 簽章(如 AWS Signature V4)則以 HMAC-SHA256 對請求參數簽署,確認請求來源合法性。

💡 重點整理

  • 雙重保障:同時驗證資料完整性與訊息來源,純雜湊函數無法做到。
  • 安全依賴密鑰:共享密鑰一旦洩漏,HMAC 保護即完全失效。
  • 演算法選擇:建議使用 HMAC-SHA256 或以上;SHA-1 已不建議用於新系統。
  • 比對需用恆定時間:應使用 hmac.compare_digest() 防止 Timing Attack。

HMAC 以簡單的雙層雜湊結構,解決了資料驗證中最核心的兩個問題。選對底層演算法、保護好共享密鑰,是安全使用 HMAC 的最基本前提。

留言