HMAC
送信者と受信者が共有する鍵とハッシュ関数を組み合わせて、メッセージ認証コード(MAC)を作る方式。データの改ざんの検出と、送信者の認証に使う。暗号化の方式ではない。
イマシルちゃんの解説
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は、「完全性(認証)のアルゴリズム」である。
メッセージ認証符号の範囲
メッセージ認証符号は、メッセージ認証コードとも呼ばれる。HMACは、その生成方法の一つであり、すべてのメッセージ認証符号がハッシュ関数を使うわけではない。ブロック暗号を利用する方式もある。
正しい符号が付いたメッセージを第三者が複製し、そのまま再送した場合、符号の検証だけでは再利用を見抜けない。必要に応じてシーケンス番号、時刻、使い捨ての値などを認証の対象に含め、受信側で再利用を調べる。また、誤りの訂正や、誰かが盗聴した事実の検出を行う機能でもない。