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-256 | SHA-256 | 256ビット | 最もよく使われる。APIの署名検証など |
| HMAC-SHA-512 | SHA-512 | 512ビット | より高い安全性が必要な場合 |
| HMAC-SHA-1 | SHA-1 | 160ビット | 旧来のシステム。現在は非推奨 |
| HMAC-MD5 | MD5 | 128ビット | 古いプロトコルとの互換性用。非推奨 |
歴史と背景
- 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を目にする場面
【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 2104 | HMACの基本定義。Bellareらの提案を標準化した文書 |
| RFC 4231 | HMAC-SHA-224/256/384/512のテストベクター定義 |
| RFC 7515 | JSON Web Signature(JWS)。HMACをJWTに使う方法を定義 |
| RFC 7519 | JSON Web Token(JWT)の標準仕様 |
| RFC 2617 | HTTP認証(Digest認証)でHMACを活用する仕様 |
関連用語
- ハッシュ関数 — データを固定長の文字列に変換する一方向の計算処理
- SHA-256 — HMACで最もよく使われるハッシュアルゴリズム
- 共通鍵暗号 — 送受信者が同じ鍵を使う暗号方式
- デジタル署名 — 公開鍵を使って否認防止まで実現する署名技術
- JWT(JSON Web Token) — HMACやRSAで署名されたJSON形式のトークン
- TLS(Transport Layer Security) — 通信経路の暗号化。内部でHMACを利用している
- API認証 — WebAPIへのアクセスを制御する認証の仕組み全般
- 改ざん検知 — データが途中で書き換えられていないかを確認する技術