メッセージ認証コード(MAC)
メッセージ認証コード(MAC) とは何ですか?
メッセージ認証コード(MAC)共有秘密鍵で計算・検証される短い対称鍵タグで、メッセージの認証と改ざん検知を行う仕組み。
メッセージ認証コード(Message Authentication Code、MAC)は、対称秘密鍵を用いてメッセージから計算する固定長のタグで、検証にも同じ鍵が必要です。完全性と真正性を提供しますが、双方が鍵を保持するため否認防止は提供しません。代表的な構成には、HMAC(ハッシュベース、RFC 2104)、CMAC(CBC-MAC、NIST SP 800-38B)、GMAC(GCM で使用)、Poly1305(ChaCha20-Poly1305 で ChaCha20 と組み合わされる、RFC 8439)、KMAC(Keccak/SHA-3 上に構築、NIST SP 800-185)があります。
素朴な MAC = H(key ‖ message) ではなく HMAC が存在する理由は、MD5、SHA-1、SHA-256 のような Merkle–Damgård 構造のハッシュが 長さ拡張攻撃(length-extension attack) に対して脆弱だからです。有効なタグを知る攻撃者は、鍵なしにデータを追記して、より長いメッセージに対する有効なタグを計算できてしまいます。HMAC の入れ子構造 H(key ⊕ opad ‖ H(key ⊕ ipad ‖ msg)) はこれを防ぎ、形式的な安全性証明を持っています。
MAC は定数時間で検証しなければなりません。タグをバイト単位で比較し早期リターンすると、タイミングを通じてタグの長さが漏洩し、2009 年の Keyczar に対する偽造を可能にしました。MAC は TLS のレコード認証、IPsec AH、JWT HS256、API リクエスト署名、そしてあらゆる AEAD モードの基盤となっています。暗号文に対して MAC を計算する encrypt-then-MAC は、Lucky Thirteen のようなパディングオラクル攻撃の一因となった MAC-then-encrypt よりも推奨されます。
flowchart LR
subgraph 送信者
M1[メッセージ] --> T1["MAC(key, message)"]
K1[共有秘密鍵] --> T1
T1 --> S[メッセージ + タグを送信]
end
subgraph 受信者
S --> R["MAC(key, message) を再計算"]
K2[共有秘密鍵] --> R
R --> C{"送信されたタグと<br/>定数時間で比較"}
C -->|一致| OK[受理: 真正かつ無傷]
C -->|不一致| NO[拒否: 偽造または改ざん]
end● 例
- 01
AWS Signature Version 4 のリクエストは HMAC-SHA-256 で認証される。
- 02
TLS 1.3 が用いる ChaCha20-Poly1305 AEAD では、Poly1305 が暗号文を認証する。
● よくある質問
メッセージ認証コード(MAC) とは何ですか?
共有秘密鍵で計算・検証される短い対称鍵タグで、メッセージの認証と改ざん検知を行う仕組み。 サイバーセキュリティの 暗号 カテゴリに属します。
メッセージ認証コード(MAC) とはどういう意味ですか?
共有秘密鍵で計算・検証される短い対称鍵タグで、メッセージの認証と改ざん検知を行う仕組み。
メッセージ認証コード(MAC) からどのように防御しますか?
メッセージ認証コード(MAC) に対する防御は通常、上記の定義で述べたとおり、技術的統制と運用上の実践を組み合わせます。
メッセージ認証コード(MAC) の別名は何ですか?
一般的な別名: MAC, 暗号学的チェックサム。