暗号化の基礎

HMAC(ハッシュベースメッセージ認証コード) えいちまっく

メッセージ認証コードハッシュ関数改ざん検知共通鍵SHA-256デジタル署名
HMACについて教えて

簡単に言うとこんな感じ!

データに「封印シール」を貼るような仕組みだよ!送り主だけが知っている秘密の鍵を使ってシールを作るから、途中でデータが書き換えられたり、なりすましがあったりするとすぐバレるんだ。メッセージが本物かどうか確認するためのしくみってこと!


HMACとは

HMAC(Hash-based Message Authentication Code) とは、ハッシュ関数と共通鍵(秘密鍵)を組み合わせて生成するメッセージ認証コードのことです。「このデータは正しい送り主から来たものか」「途中で改ざんされていないか」の2点を同時に確認できる技術です。

HMACが保証するのは 完全性(データが改ざんされていないこと)認証(正当な送り主であること) の2つです。暗号化(データを読めなくすること)とは別の概念なので注意が必要です。ネット通販の決済APIや、Webアプリのログイン処理など、「データのやり取りを安全に行いたい」あらゆるシーンで使われています。

ビジネス的には、外部サービスとAPIで連携する際の「署名検証」 に頻出します。たとえばWebhook(外部サービスからの通知)を受け取るとき、「本当にそのサービスから来た通知か」をHMACで確認することが一般的です。


HMACの仕組みと構造

HMACの計算ステップ

ステップ処理内容たとえると…
① 鍵の準備送受信者が共有する秘密鍵を用意合鍵を2人だけで持つ
② 内側ハッシュ鍵とメッセージをハッシュ関数に通す材料を混ぜて一度焼く
③ 外側ハッシュ①の結果に再度鍵を絡めてハッシュ化もう一度別の材料で包んで焼く
④ 出力固定長のHMAC値(タグ)が完成封印シールの完成

内部の計算式はこのように表せます:

HMAC(K, m) = H( (K ⊕ opad) || H( (K ⊕ ipad) || m ) )

K    : 秘密鍵
m    : メッセージ
H    : ハッシュ関数(SHA-256など)
opad : 外側パディング(0x5c を繰り返したもの)
ipad : 内側パディング(0x36 を繰り返したもの)
||   : 連結
⊕   : XOR演算

2段階でハッシュをかけることで、ハッシュ関数の脆弱性を突いた「長さ拡張攻撃」を防ぐ設計になっています。

覚え方:「鍵でサンドイッチ」

HMACは 鍵でメッセージをサンドイッチする イメージで覚えましょう。
「内側(ipad)にも外側(opad)にも鍵を絡めて2回ハッシュ」→ 二重の封印シール!

よく使われるハッシュ関数の組み合わせ

名称ハッシュ関数出力長用途・特徴
HMAC-SHA-256SHA-256256ビット最もよく使われる。APIの署名検証など
HMAC-SHA-512SHA-512512ビットより高い安全性が必要な場合
HMAC-SHA-1SHA-1160ビット旧来のシステム。現在は非推奨
HMAC-MD5MD5128ビット古いプロトコルとの互換性用。非推奨

歴史と背景

  • 1996年 — Bellare・Canetti・Krawczykの3氏が論文でHMACを提唱。単純な「鍵+ハッシュ」では攻撃に弱いことを証明し、2段階構造を考案
  • 1997年 — IETF(インターネット技術標準化団体)がRFC 2104としてHMACを標準化
  • 2000年代 — SSL/TLSやIPsecなど主要なセキュリティプロトコルに組み込まれ急速に普及
  • 2008年 — NIST(米国標準技術研究所)がFIPS PUB 198-1としてHMACを連邦標準に認定
  • 2010年代〜現在REST APIの認証(AWS Signature V4など)、JWT(JSON Web Token)、Webhookの署名検証など、Web開発の標準的な部品として定着

HMACと関連技術の比較

HMACと似た目的を持つ技術がいくつかあります。どれを使うかは用途と状況で選びます。

データ保護技術の比較マップ HMAC ✔ 改ざん検知 ✔ 送信者認証 ✘ 暗号化なし 共通鍵を使用 高速・軽量 デジタル署名 ✔ 改ざん検知 ✔ 送信者認証 ✔ 否認防止 公開鍵を使用 低速・重い ハッシュのみ ✔ 改ざん検知 ✘ 送信者認証なし ✘ 否認防止なし 鍵不要 最軽量 用途で選ぶ目安 🔵 HMAC → APIの署名検証、Webhook認証、JWTのHS256など 🟢 デジタル署名 → 電子契約、コードの署名、TLS証明書など「否認防止」が必要な場面 🟣 ハッシュのみ → パスワードの保管(bcrypt等)、ファイルの整合性チェックなど

実務でHMACを目にする場面

【AWS署名バージョン4の例】
リクエストをHMAC-SHA256で署名し、
Authorizationヘッダーに含めてAPIを呼び出す

Authorization: AWS4-HMAC-SHA256
  Credential=AKIAIOSFODNN7EXAMPLE/20250409/ap-northeast-1/s3/aws4_request,
  SignedHeaders=host;x-amz-date,
  Signature=(HMAC-SHA256で計算した値)

【Webhookの検証例(GitHub等)】
受け取ったリクエストのX-Hub-Signature-256ヘッダーに
HMAC-SHA256の値が入っている。
同じ鍵でHMACを計算し、値が一致すれば本物と判断する。

関連する規格・RFC

規格・RFC番号内容
RFC 2104HMACの基本定義。Bellareらの提案を標準化した文書
RFC 4231HMAC-SHA-224/256/384/512のテストベクター定義
RFC 7515JSON Web Signature(JWS)。HMACをJWTに使う方法を定義
RFC 7519JSON Web Token(JWT)の標準仕様
RFC 2617HTTP認証(Digest認証)でHMACを活用する仕様

関連用語