---
title: "HMACとは？ハッシュと共通鍵でメッセージを認証する仕組み【SG試験】"
description: "HMACは、ハッシュ関数と共通鍵を組み合わせてメッセージの改ざん検知と送信者確認を行う仕組みです。SG試験・情報セキュリティマネジメント試験で混同しやすいハッシュ、MAC、デジタル署名、暗号化との違いを整理します。"
last_modified_at: "2026-07-09"
canonical_url: "https://stemtazoo.github.io/sg/hmac/"
section: "sg"
---

## まず結論

HMAC（Hash-based Message Authentication Code）とは、**ハッシュ関数と共通鍵を組み合わせて、メッセージの改ざんを検出する仕組み**です。

SG試験では、次のように押さえると判断しやすくなります。

- **ハッシュ**：データから要約値を作る
- **MAC**：共通鍵を使ってメッセージを認証する
- **HMAC**：ハッシュ関数を使って作るMACの一種
- **デジタル署名**：秘密鍵と公開鍵で、改ざん検知と否認防止を行う

HMACは、単なるハッシュではありません。  
**共通鍵を使うことで、鍵を知らない人が正しい認証値を作れない**ようにしている点がポイントです。

---

## 直感的な説明

HMACは、メッセージに付ける**鍵付きの確認シール**のようなものです。

通常のハッシュは、誰でも同じメッセージから同じハッシュ値を作れます。  
そのため、攻撃者がメッセージを書き換えて、新しいハッシュ値を付け直すこともできてしまいます。

一方、HMACでは、メッセージだけでなく**共通鍵**も使って認証値を作ります。

そのため、鍵を知らない人は、正しいHMAC値を作れません。

つまりHMACは、

- メッセージが途中で変わっていないか
- 同じ共通鍵を持つ相手が作ったものか

を確認するための仕組みです。

---

## 定義・仕組み

HMACは、**ハッシュ関数をもとにしたメッセージ認証コード**です。

基本的な流れは次のとおりです。

1. 送信者と受信者が、あらかじめ共通鍵を共有する
2. 送信者が、メッセージと共通鍵からHMAC値を作る
3. メッセージとHMAC値を一緒に送る
4. 受信者も、受け取ったメッセージと共通鍵からHMAC値を計算する
5. 送られてきたHMAC値と一致するか確認する

一致すれば、メッセージが改ざんされていない可能性が高いと判断できます。  
一致しなければ、改ざんや不正な送信の可能性を疑います。

ここで大切なのは、HMACが**ハッシュ関数だけでなく、共通鍵を使う**という点です。

---

## どんな場面で使う？

HMACは、通信やシステム間のデータ連携で、**リクエストやメッセージが改ざんされていないか確認したい場面**で使われます。

たとえば、次のような場面です。

- API通信で、リクエストが正当な相手から送られたか確認する
- Webサービス間の通信で、データが途中で改ざんされていないか確認する
- メッセージ認証が必要な通信プロトコルで使う
- 共通鍵を共有しているシステム同士で、送信元と完全性を確認する

SG試験では、HMACを「暗号化」ではなく、**メッセージ認証と改ざん検知の仕組み**として整理しましょう。

---

## よくある誤解・混同

### HMACとハッシュの違い

HMACとハッシュは似ていますが、役割が違います。

| 項目 | ハッシュ | HMAC |
|---|---|---|
| 使うもの | メッセージ | メッセージ＋共通鍵 |
| 鍵 | 使わない | 使う |
| 主な目的 | 要約値の作成、改ざん検知の補助 | メッセージ認証、改ざん検知 |
| 誰でも作れるか | 作れる | 鍵を知らないと作れない |

通常のハッシュ値は誰でも計算できます。  
一方、HMAC値は共通鍵を知らないと正しく作れません。

この違いが、SG試験での重要ポイントです。

---

### HMACとMACの違い

HMACは、MACの一種です。

- **MAC**：共通鍵を使うメッセージ認証コードの総称
- **HMAC**：ハッシュ関数を使って作るMAC

つまり、HMACはMACの具体的な方式の1つです。

問題文に「ハッシュ関数を用いたメッセージ認証コード」とあれば、HMACを選びます。

---

### HMACとデジタル署名の違い

HMACとデジタル署名は、どちらも改ざん検知に使えます。  
ただし、鍵の使い方と否認防止の有無が違います。

| 項目 | HMAC | デジタル署名 |
|---|---|---|
| 鍵 | 共通鍵 | 秘密鍵・公開鍵 |
| 改ざん検知 | できる | できる |
| 送信者確認 | できる | できる |
| 否認防止 | 弱い | できる |
| 検証できる人 | 共通鍵を持つ人 | 公開鍵を持つ人 |

HMACでは、送信者と受信者が同じ共通鍵を持っています。  
そのため、第三者に対して「誰が作ったか」を強く証明する用途には向きません。

**否認防止が問われたら、HMACではなくデジタル署名**を選びます。

---

### HMACと暗号化の違い

HMACは、メッセージの内容を読めなくする仕組みではありません。

- **HMAC**：改ざんされていないか、正当な相手からかを確認する
- **暗号化**：第三者に内容を読まれないようにする

問題文に「盗聴を防ぐ」「内容を秘匿する」とあれば、HMACではなく暗号化の話です。

---

## SG試験での判断ポイント

HMACが選択肢に出たら、次の言葉に注目します。

| 問題文のキーワード | 判断 |
|---|---|
| ハッシュ関数を使うMAC | HMAC |
| 共通鍵、メッセージ認証、改ざん検知 | MACまたはHMAC |
| 鍵を使わない要約値 | ハッシュ |
| 秘密鍵で署名、公開鍵で検証 | デジタル署名 |
| 否認防止 | デジタル署名 |
| 内容を読めなくする | 暗号化 |

特に、HMACは**ハッシュ関数を使うが、ただのハッシュではない**という点が狙われやすいです。

「ハッシュ関数」だけに引っ張られず、**共通鍵を使うかどうか**を確認しましょう。

---

## 確認問題

<details>
<summary>確認問題：HMACの説明として最も適切なものはどれか</summary>

HMACの説明として、最も適切なものはどれか。

- ア：ハッシュ関数と共通鍵を用いて、メッセージの改ざん検知と認証を行う。
- イ：画像や音声の中にメッセージを埋め込み、存在を隠す。
- ウ：公開鍵を使って署名を作成し、秘密鍵で検証する。
- エ：メッセージを一定の手順で変換し、第三者に内容を読めなくする。

**正解：ア**

HMACは、ハッシュ関数と共通鍵を組み合わせたメッセージ認証コードです。  
メッセージが改ざんされていないか、同じ共通鍵を持つ正当な相手から送られたものかを確認します。

イはステガノグラフィ、ウはデジタル署名の鍵の説明が逆、エは暗号化の説明です。

</details>

---

## まとめ（試験直前用）

- HMACは、**ハッシュ関数と共通鍵を使うMACの一種**
- 通常のハッシュと違い、**鍵を知らない人は正しいHMAC値を作れない**
- 否認防止が問われたら、HMACではなくデジタル署名を選ぶ

HMACは「ハッシュ」という名前に引っ張られやすい用語です。  
SG試験では、**ハッシュ関数＋共通鍵＝メッセージ認証**と整理しておきましょう。
