MACとデジタル署名の違い ― メッセージ認証符号
メッセージ認証符号
メッセージ認証符号(MAC)とは
メッセージ認証符号(MAC)は、届いたデータが途中で書き換えられていないかを確かめるための短い値です。送信者と受信者が共有する秘密の鍵と、メッセージから計算します。HTTPSの通信や、ワンタイムパスワードを作る計算にも使われています。
受信者は、同じ鍵で計算し直します。値が一致すれば、改ざんされていないことと、同じ鍵を持つ誰かが作ったことを確かめられます。
よく比べられるデジタル署名との違いは、鍵の持ち方です。MACは両者が同じ鍵を持つので、送った本人があとで否定することは防げません。英語ではMessage Authentication Codeと書きます。ネットワークのMACアドレスのMACはMedia Access Controlの略で、別の言葉です。
ハッシュ値だけでは足りない理由
ハッシュ関数を使うと、本文のハッシュ値を一緒に送り、受信者が計算し直して比べられます。ただし、ハッシュ値は鍵を使わずに、誰でも計算できます。途中で本文を書き換えた人は、新しい本文のハッシュ値を計算し直して付け替えられます。
こうなると、受信者が計算し直した値と、届いた値は一致します。本文とハッシュ値の両方を書き換えられると、この比較では気づけません。
そこで、計算に秘密の鍵を混ぜます。鍵を持たない人は、書き換えた本文に合う正しい値を作れません。これがMACの考え方です。
MACの流れ:計算して付け、計算し直して比べる
送信者と受信者は、前もって同じ秘密の鍵を共有しておきます。アメリカの国立標準技術研究所(NIST)の規格FIPS 198-1は、この鍵を送信者と受信者だけが知るものとしています。
- 送信者が、鍵と本文からMACの値を計算します。
- 送信者は、本文とMACの値を一緒に送ります。
- 受信者は、届いた本文と自分の鍵から、MACの値を計算し直します。
- 受信者は、計算した値と届いた値を比べます。
2つの値が一致すれば、本文は途中で変わっていません。同じ規格によると、このとき受信者は、送信者が鍵を共有する利用者の1人だと確かめられます。一致しなければ、本文か値が途中で変わったか、値が別の鍵で作られたことになります。
MACは本文を読めなくするものではありません。本文を隠したいときは、別に暗号化を使います。
HMACとは:ハッシュ関数と鍵で作るMAC
HMACは、ハッシュ関数と秘密の鍵を組み合わせてMACを計算する方式です。RFC 2104が1997年に示し、NISTはFIPS 198-1で規格にしています。既存のハッシュ関数を、計算の手順を変えずにそのまま使えるように作られています。
使うハッシュ関数は選べます。RFC 2104は、使うハッシュ関数の名前を付けて、HMAC-SHA1のように呼ぶと定めています。いまはSHA-256を使うHMAC-SHA256などが使われます。
HMACの強さは、使うハッシュ関数の性質と、鍵に左右されます。RFC 2104は、鍵を乱数で選び、定期的に新しくするよう求めています。NISTの手引きSP 800-107によると、鍵を知った人は、鍵を共有する誰にでもなりすませます。そのため、鍵を秘密に保つよう定めています。
MACには、ハッシュ関数ではなくブロック暗号を使って作る方式もあります。ブロック暗号は、データを一定の長さに区切って暗号化する方式です。同じ手引きは、承認されたMACとして、ブロック暗号に基づくものとHMACの2種類を挙げています。
MACとデジタル署名の違い:否認防止ができるか
デジタル署名では、送信者が自分の秘密鍵で署名を作ります。受信者は、送信者の公開鍵で署名を検証します。作る鍵と確かめる鍵が別なので、受信者は署名を作れません。
MACでは、受信者も送信者と同じ鍵を持っています。そのため、受信者にも同じMACの値が作れます。送信者が「送っていない」と言ったとき、送信者が作ったことを第三者に示す手段がありません。
作った人を第三者に示せるようにして、送った本人があとで否定できないようにすることを、否認防止と呼びます。NISTの手引きSP 800-107の定義では、デジタル署名で送信元の認証と完全性の保護ができます。これに加えて、署名者の否認防止もできます。MACで確かめられるのは、鍵を共有する誰かが作ったことまでです。
ただし、デジタル署名にも前提があります。検証に使う公開鍵が本当に送信者のもので、秘密鍵を送信者だけが持っていなければなりません。公開鍵の持ち主は、電子証明書で保証します。
ハッシュ値・MAC・デジタル署名で確かめられること
3つの方式で、何を確かめられるかを表にまとめます。下の行ほど確かめられることが増え、そのぶん鍵の扱いが増えます。
| 方式 | 改ざんの | 送信元の | 否認防止 | 使う |
|---|---|---|---|---|
| ハッシュ値だけ | 値を | できない | できない | 使わない |
| MAC | できる | 鍵を | できない | 送信者と |
| デジタル署名 | できる | できる | できる | 送信者の |
MACを使うには、前もって鍵を相手と安全に共有しておく必要があります。この課題は、共通鍵暗号の鍵配送問題と同じです。
確かめたいことから方式を選ぶ
MACとデジタル署名のどちらで足りるかは、何を確かめたいかで決まります。次の図で確かめたいことを選ぶと、MACとデジタル署名のそれぞれで足りるかが出ます。足りる方式の枠は、緑で示します。
改ざんの検出と、鍵を共有する相手から来たかの確認だけなら、MACで足ります。第三者に向けて送信者を示す必要があるときは、デジタル署名を使います。
MACが使われている場所
Webの通信を守るTLSでも、HMACが使われています。TLS 1.2を定めたRFC 5246では、通信のデータの完全性を守るためにMACを使います。その計算にはHMACを使います。TLSのしくみはHTTPとHTTPSの記事で説明しています。
TLS 1.3を定めたRFC 9846では、データを守る方式が、暗号化と改ざんの検出を一度に行う方式に整理されました。それでも、接続の手順の最後に送るFinishedというメッセージの値は、HMACで計算します。
ワンタイムパスワードの方式HOTPも、HMACで値を作ります。RFC 4226は、HMAC-SHA-1の結果を短く切り詰めてパスワードにすると定めています。ワンタイムパスワードをログインでどう使うかは、多要素認証の記事にあります。
練習問題(全5問)
正解:送信者と
MACは、
正解:受信者も
MACの
正解:
ハッシュ値は
正解:ハッシュ関数と
HMACは、
正解:デジタル署名
デジタル署名の
選んでから「採点する」を押すと、解説つきで答え合わせができます。
参考にした資料
- RFC 2104「HMAC: Keyed-Hashing for Message Authentication」(MACとHMACの定義、鍵の選び方)
- NIST FIPS 198-1「The Keyed-Hash Message Authentication Code」(MACの目的と、送信者・受信者の手順)
- NIST SP 800-107 Rev.1(デジタル署名の否認防止、HMACの鍵、ブロック暗号に基づくMAC)
- NIST FIPS 186-5「Digital Signature Standard」(否認防止の定義)
- RFC 5246・RFC 9846(TLS 1.2・TLS 1.3でのHMAC)
- RFC 4226(HOTPでのHMAC)
関連記事
おすすめの本 PR
セキュリティとデータベースは、基本情報技術者試験の対策本でまとめて学べます。

