ITの教科書検索
入門読了 約9分

MACとデジタル署名の違い ― メッセージ認証符号

メッセージ認証符号(MAC)は、共有した鍵で計算して改ざんを見つける値です。HMACの仕組みと、デジタル署名と違って否認防止ができない理由を図で確かめられます。

目次
  1. メッセージ認証符号(MAC)とは
  2. ハッシュ値だけでは足りない理由
  3. MACの流れ:計算して付け、計算し直して比べる
  4. HMACとは:ハッシュ関数と鍵で作るMAC
  5. MACとデジタル署名の違い:否認防止ができるか
  6. ハッシュ値・MAC・デジタル署名で確かめられること
  7. 確かめたいことから方式を選ぶ
  8. MACが使われている場所
  9. 練習問題

メッセージ認証符号(MAC)とは

メッセージ認証符号(MAC)は、届いたデータが途中で書き換えられていないかを確かめるための短い値です。送信者と受信者が共有する秘密の鍵と、メッセージから計算します。HTTPSの通信や、ワンタイムパスワードを作る計算にも使われています。

受信者は、同じ鍵で計算し直します。値が一致すれば、改ざんされていないことと、同じ鍵を持つ誰かが作ったことを確かめられます。

よく比べられるデジタル署名との違いは、鍵の持ち方です。MACは両者が同じ鍵を持つので、送った本人があとで否定することは防げません。英語ではMessage Authentication Codeと書きます。ネットワークのMACアドレスのMACはMedia Access Controlの略で、別の言葉です。

ハッシュ値だけでは足りない理由

ハッシュ関数を使うと、本文のハッシュ値を一緒に送り、受信者が計算し直して比べられます。ただし、ハッシュ値は鍵を使わずに、誰でも計算できます。途中で本文を書き換えた人は、新しい本文のハッシュ値を計算し直して付け替えられます。

こうなると、受信者が計算し直した値と、届いた値は一致します。本文とハッシュ値の両方を書き換えられると、この比較では気づけません。

そこで、計算に秘密の鍵を混ぜます。鍵を持たない人は、書き換えた本文に合う正しい値を作れません。これがMACの考え方です。

MACの流れ:計算して付け、計算し直して比べる

送信者と受信者は、前もって同じ秘密の鍵を共有しておきます。アメリカの国立標準技術研究所(NIST)の規格FIPS 198-1は、この鍵を送信者と受信者だけが知るものとしています。

  1. 送信者が、鍵と本文からMACの値を計算します。
  2. 送信者は、本文とMACの値を一緒に送ります。
  3. 受信者は、届いた本文と自分の鍵から、MACの値を計算し直します。
  4. 受信者は、計算した値と届いた値を比べます。

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(メッセージ認証符号)送信者共通鍵Kで値を作る本文+MAC値を送る受信者共通鍵Kで計算し直す共通鍵K共通鍵K同じ鍵を共有値を作れる人送信者と受信者否認防止:できないデジタル署名送信者秘密鍵で署名を作る本文+署名を送る受信者送信者の公開鍵で検証秘密鍵送信者の公開鍵対になる別の鍵値を作れる人送信者だけ否認防止:できる共通鍵秘密鍵公開鍵MAC(メッセージ認証符号)送信者共通鍵Kで値を作る本文+MAC値を送る受信者共通鍵Kで計算し直す値を作れる人:送信者と受信者否認防止:できないデジタル署名送信者秘密鍵で署名を作る本文+署名を送る受信者送信者の公開鍵で検証値を作れる人:送信者だけ否認防止:できる共通鍵秘密鍵公開鍵
MACでは、送信者と受信者が同じ鍵を持ちます。受信者も同じ値を作れるので、送信者が作ったことを第三者に示せません。デジタル署名の秘密鍵は送信者だけが持つので、署名を作れるのは送信者だけです。

MACでは、受信者も送信者と同じ鍵を持っています。そのため、受信者にも同じMACの値が作れます。送信者が「送っていない」と言ったとき、送信者が作ったことを第三者に示す手段がありません。

作った人を第三者に示せるようにして、送った本人があとで否定できないようにすることを、否認防止と呼びます。NISTの手引きSP 800-107の定義では、デジタル署名で送信元の認証と完全性の保護ができます。これに加えて、署名者の否認防止もできます。MACで確かめられるのは、鍵を共有する誰かが作ったことまでです。

ただし、デジタル署名にも前提があります。検証に使う公開鍵が本当に送信者のもので、秘密鍵を送信者だけが持っていなければなりません。公開鍵の持ち主は、電子証明書で保証します。

ハッシュ値・MAC・デジタル署名で確かめられること

3つの方式で、何を確かめられるかを表にまとめます。下の行ほど確かめられることが増え、そのぶん鍵の扱いが増えます。

方式改ざんの検出送信元の確認否認防止使う鍵
ハッシュ値だけ値を別の経路で受け取ればできるできないできない使わない
MACできる鍵を共有する誰かまでできるできない送信者と受信者で同じ鍵
デジタル署名できるできるできる送信者の秘密鍵と公開鍵

MACを使うには、前もって鍵を相手と安全に共有しておく必要があります。この課題は、共通鍵暗号の鍵配送問題と同じです。

確かめたいことから方式を選ぶ

MACとデジタル署名のどちらで足りるかは、何を確かめたいかで決まります。次の図で確かめたいことを選ぶと、MACとデジタル署名のそれぞれで足りるかが出ます。足りる方式の枠は、緑で示します。

確かめたいこと
届いた本文が、送られたときから1文字も変わっていないかを確かめたい場面です。
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問)

Q1メッセージ認証符号(MAC)の説明として正しいものは?
Q2MACで否認防止ができない理由として正しいものは?
Q3本文とハッシュ値だけを一緒に送るとき、途中で本文とハッシュ値の両方を書き換えられると、受信者はどうなる?
Q4HMACの説明として正しいものは?
Q5契約の申込みのデータについて、送った本人があとで「送っていない」と言えないようにしたい。使う技術として適切なものは?

選んでから「採点する」を押すと、解説つきで答え合わせができます。

参考にした資料

関連記事

おすすめの本 PR

セキュリティとデータベースは、基本情報技術者試験の対策本でまとめて学べます。

目的別の本の選び方を見る

セキュリティの記事を続けて読む

セキュリティ 全37本中17本目