HMAC

読み:えいちまっく / 英語表記:Hash-based Message Authentication Code

送信者と受信者が共有する鍵とハッシュ関数を組み合わせて、メッセージ認証コード(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 のように呼ばれる。

使い方

  1. 送信者は、メッセージと共有鍵からMAC値を計算し、メッセージに付けて送る
  2. 受信者は、受け取ったメッセージと共有鍵から、同じようにMAC値を計算する
  3. 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は、その生成方法の一つであり、すべてのメッセージ認証符号がハッシュ関数を使うわけではない。ブロック暗号を利用する方式もある。

正しい符号が付いたメッセージを第三者が複製し、そのまま再送した場合、符号の検証だけでは再利用を見抜けない。必要に応じてシーケンス番号、時刻、使い捨ての値などを認証の対象に含め、受信側で再利用を調べる。また、誤りの訂正や、誰かが盗聴した事実の検出を行う機能でもない。

実際の試験ではここに出る!全5問

ネットワークスペシャリスト

午前Ⅱ

この用語が出てくる記事

↑