HMAC
送信者と受信者が共有する鍵とハッシュ関数を組み合わせて、メッセージ認証コード(MAC)を作る方式。データの改ざんの検出と、送信者の認証に使う。暗号化の方式ではない。
イマシルちゃんの解説
ハッシュ値は、データの「指紋」みたいなものだったよね。
でも、ハッシュ値だけだと、悪い人がデータを書き換えて、ハッシュ値も計算し直したら、バレないんだ。
HMACは、送る人と受け取る人だけが知っている「秘密の合言葉(鍵)」を混ぜて、指紋を作るんだ。
合言葉を知らない人には、正しい指紋が作れない。
だから、書き換えられていないこと、本物の相手から届いたことを確かめられるんだよ!
より深い解説
定義
HMAC(Hash-based Message Authentication Code)は、RFC 2104で定められた、ハッシュ関数を使ってメッセージ認証コード(MAC)を計算する方式である。送信者と受信者が共有する秘密鍵と、メッセージから、MAC値を計算する。
HMAC(K, m) = H( (K ⊕ opad) ‖ H( (K ⊕ ipad) ‖ m ) )
Kは鍵、mはメッセージ、Hはハッシュ関数、ipadとopadは決められた定数、⊕は排他的論理和、‖は連結を表す。ハッシュ関数を2回使う構造で、単純に「鍵とメッセージをつなげてハッシュ値をとる」方法の弱点を避けている。
使うハッシュ関数によって、HMAC-SHA1、HMAC-SHA-256 のように呼ばれる。
使い方
- 送信者は、メッセージと共有鍵からMAC値を計算し、メッセージに付けて送る
- 受信者は、受け取ったメッセージと共有鍵から、同じようにMAC値を計算する
- 2つのMAC値が一致すれば、メッセージは改ざんされておらず、鍵を持つ相手から送られたと判断できる
実現できること・できないこと
| 性質 | HMACで |
|---|---|
| 完全性(改ざんの検出) | できる |
| 送信者の認証(鍵を持つ相手か) | できる |
| 機密性(暗号化) | できない。メッセージそのものは平文のまま |
| 否認防止 | できない(鍵を共有しているため、どちらが作ったかを第三者に証明できない) |
ハッシュ値・デジタル署名との比較
| 方式 | 鍵 | 改ざんの検出 | 送信者の認証 | 否認防止 |
|---|---|---|---|---|
| ハッシュ値だけ | なし | 偶然の誤りは検出できるが、意図的な改ざんは見抜けない | できない | できない |
| HMAC | 共通鍵 | できる | できる | できない |
| デジタル署名 | 公開鍵と秘密鍵 | できる | できる | できる |
使われている場面
| 場面 | 用途 |
|---|---|
| IPsec(ESP、AH) | パケットの完全性と認証(HMAC-SHA-256 など) |
| TLS | 鍵の導出(HKDF)や、古い暗号スイートでのレコードの完全性 |
| Web API | リクエストの署名(APIの鍵でHMACを計算して付ける) |
| ワンタイムパスワード | HOTP、TOTPは、HMACを使ってワンタイムパスワードを作る |
IPsecで「暗号化のアルゴリズム」として挙げられるのはAESなどであり、HMAC-SHA1やHMAC-SHA-256は、「完全性(認証)のアルゴリズム」である。