前回までの記事で、データを「盗聴」から守るための暗号化技術について学んできました。共通鍵暗号、公開鍵暗号、そしてそれらを組み合わせたハイブリッド暗号(SSL/TLS)。これで通信の内容を他人に見られる心配はなくなりました。
しかし、ここで一つ重要な疑問が浮かびます。
「暗号化されたデータが、途中で書き換えられていたらどうなるのか?」
実は、暗号化だけではこの問題を解決できません。悪意ある第三者が通信途中でデータを書き換え、受信者に届いたデータが「100万円の送金」から「1000万円の送金」に変わっていたとしても、暗号化だけでは気づけないのです。
そこで登場するのが、今回のテーマである「ハッシュ関数」と「メッセージ認証コード(MAC)」です。
この技術は、データに「デジタル指紋」を付けることで、わずか1文字の改ざんも見逃しません。SSL/TLS、ブロックチェーン、パスワード管理システムなど、現代のセキュリティ技術の根幹を支える仕組みです。
今回は、この「改ざん検知」の技術を、実例を交えながら徹底的に解説していきます。
ハッシュ関数とは?「データの指紋」を作る魔法の計算式
1冊の本も1行の文章も、同じ長さの「指紋」に変換される
ハッシュ関数(Hash Function)を一言で表現するなら、「どんなデータも固定長の文字列に変換する、一方通行の計算式」です。
例えば、「こんにちは」という5文字の文章をSHA-256というハッシュ関数で処理すると、以下のような64文字の文字列(16進数表記)に変換されます。
e5f3ca8c8e8c8b8f8a8d8c8e9f9a9b9c9d9e9f0a0b0c0d0e0f...
驚くべきことに、100ページの論文をSHA-256で処理しても、出力される文字列は同じ64文字です。この「固定長に変換する」という特性が、データの完全性を効率的に検証する鍵となっています。
ハッシュ関数が持つ3つの「魔法の性質」
ハッシュ関数がセキュリティ技術として機能するのは、以下の3つの特殊な性質があるからです。これらは情報処理技術者試験でも頻出の重要ポイントです。
性質1:一方向性(不可逆性)— 元に戻すことは絶対に不可能
ハッシュ値から元のデータを復元することは、数学的に不可能です。
例えば、あなたのパスワード「MySecret123」をSHA-256でハッシュ化すると、特定のハッシュ値が生成されます。しかし、このハッシュ値からは、どんなスーパーコンピュータを使っても元のパスワードを計算で求めることはできません。
これが、Webサービスが「パスワードを忘れた場合は再発行」という対応をする理由です。運営側もハッシュ値しか保存していないため、元のパスワードを知ることができないのです。
この「不可逆」な性質を「一方向性」と呼びます。
性質2:衝突困難性 — 異なるデータが同じ指紋になる確率は天文学的に低い
理論上、無限のデータを有限の長さ(例:256ビット)に変換するため、異なるデータなのに同じハッシュ値が生成される現象(衝突(コリジョン))は避けられません。
しかし、SHA-256の場合、衝突が起きる確率は2の256乗分の1。これは、地球上の全ての砂粒の数(約10の23乗個)よりもはるかに大きな数です。実質的に、人類が存在する時間スケールでは衝突を見つけることは不可能と言えます。
この「衝突を見つけるのが非常に難しい」という性質を「衝突困難性」と呼びます。
性質3:雪崩効果(アバランチ効果)— 1文字変わるだけで指紋は激変する
元のデータがほんの1ビット変わるだけで、生成されるハッシュ値は完全に異なるものになります。
例えば、以下の2つの文章を比較してみましょう。
- 「100万円を送金する」
- 「100万円を送金した」(「する」→「した」に変更)
たった1文字の違いですが、それぞれのSHA-256ハッシュ値は、全く似ていない別物になります。共通する部分はほぼゼロです。
この性質のおかげで、データのわずかな改ざんも確実に検知できるのです。この現象を「雪崩効果(Avalanche Effect)」と呼びます。
主要なハッシュ関数の進化史 — MD5からSHA-3まで
危殆化した旧世代:MD5とSHA-1
かつて広く使われていた「MD5」(1991年開発)と「SHA-1」(1995年開発)は、現在ではセキュリティ上使用すべきではない規格とされています。
2017年、Googleの研究チームが実際にSHA-1の衝突を発見したことで、その脆弱性が実証されました。MD5に至っては、一般的なPCでも数時間で衝突を見つけられるレベルまで解析技術が進んでいます。
これを「危殆化(きたいか)」と呼び、古い規格は新しい規格に移行する必要があります。
現在の標準:SHA-2ファミリー(SHA-256が主流)
現在、世界中で最も広く使われているのが「SHA-2」ファミリーです。
特にSHA-256は、以下のような重要なシステムで標準採用されています。
- SSL/TLS証明書(Webサイトのhttps通信)
- ビットコイン・ブロックチェーン
- Git(バージョン管理システム)
- 電子署名システム
SHA-2には、出力ビット長によって複数のバリエーション(SHA-224、SHA-256、SHA-384、SHA-512)がありますが、セキュリティと処理速度のバランスが最も優れているSHA-256が主流です。
次世代規格:SHA-3
2015年に標準化されたSHA-3は、SHA-2とは全く異なる数学的アルゴリズム(スポンジ構造)を採用しています。これは、将来SHA-2に脆弱性が発見された場合の「保険」として開発されました。
現在はSHA-2で十分安全ですが、今後10〜20年のスパンで徐々にSHA-3への移行が進むと考えられています。
メッセージ認証コード(MAC)— ハッシュ関数の弱点を克服する
ハッシュ関数だけでは「なりすまし」を防げない
ここまで読んで、「ハッシュ関数だけで改ざん検知は完璧では?」と思われるかもしれません。
しかし、重大な問題があります。誰でもハッシュ値を計算できるという点です。
具体例で考えてみましょう。
- Aさんが「100万円を送金する」というメッセージとそのハッシュ値をBさんに送る
- 悪意のある攻撃者Cさんが通信を傍受し、メッセージを「1000万円を送金する」に書き換える
- Cさんは書き換えた新しいメッセージのハッシュ値を計算し、それをBさんに送る
- Bさんは受け取ったメッセージとハッシュ値を照合し、「一致した=改ざんなし」と判断してしまう
このように、ハッシュ関数だけでは「誰が作成したメッセージか」を証明できないのです。
「共通鍵」を混ぜることで真正性を確保する
この問題を解決するのが「メッセージ認証コード(MAC: Message Authentication Code)」です。
MACは、ハッシュ関数に「秘密の共通鍵」を組み合わせた技術です。代表的な実装方式にHMAC(Hash-based MAC)があります。
仕組みを順を追って説明します。

ステップ1:事前準備
送信者Aさんと受信者Bさんは、あらかじめ秘密の共通鍵Kを安全な方法で共有しておきます(例:対面で交換、公開鍵暗号で送信など)。
ステップ2:MAC生成(送信側)
Aさんは、送信したいメッセージMと共通鍵Kを組み合わせて、特別なハッシュ値(MAC)を計算します。
MAC = Hash(K + M)
実際のHMACはもう少し複雑な計算式ですが、本質は「鍵とメッセージを混ぜてハッシュ化する」ことです。
ステップ3:送信
Aさんは、メッセージMとMAC値をBさんに送ります(共通鍵Kは送りません)。
ステップ4:検証(受信側)
Bさんは、受け取ったメッセージMと、自分が持っている共通鍵Kを使って、自分でMAC値を計算します。
ステップ5:判定
受信したMAC値と、自分で計算したMAC値を比較します。
- 一致した場合:メッセージは改ざんされておらず、かつ共通鍵Kを持っているAさん本人が作成したものと確認できる
- 不一致の場合:改ざんされたか、なりすましの可能性があるため破棄する
MACが防ぐ2つの脅威
MACを使うことで、以下の2つを同時に保証できます。
- 完全性(Integrity):データが改ざんされていないこと
- 真正性(Authenticity):正規の送信者から送られたものであること(なりすましでないこと)
これが、SSL/TLSをはじめとする安全な通信プロトコルで、MACが不可欠な理由です。
実社会での応用例 — あなたの身の回りにもある技術
1. Webサイトのhttps通信(SSL/TLS)
あなたがWebサイトを閲覧する際、URLが「https://」で始まっていれば、そこではHMACが使われています。ブラウザとサーバー間で送受信される全てのデータに対してMACが計算され、改ざんがないか常時チェックされています。
2. パスワード管理システム
多くのWebサービスは、ユーザーのパスワードをそのまま保存せず、SHA-256などでハッシュ化して保存しています。これにより、万が一データベースが漏洩しても、元のパスワードは保護されます。
3. ブロックチェーン・暗号資産
ビットコインなどの暗号資産は、SHA-256を使って取引データの完全性を保証しています。過去の取引データが改ざんされると、ハッシュ値が変わるため即座に検知されます。
4. ソフトウェアのダウンロード検証
公式サイトからソフトウェアをダウンロードする際、「SHA-256ハッシュ値」が併記されていることがあります。これは、ダウンロードしたファイルが改ざんされていないか、自分で検証するための情報です。
MACの限界と次なる課題「否認防止」
ここまで読むと、MACで全ての問題が解決したように思えますが、実は一つ重要な制約があります。
それは、「共通鍵」を使っているため、送信者と受信者の両方がMAC値を作成できるという点です。
例えば、AさんがBさんに「100万円貸した」という契約書データとMAC値を送ったとします。後日、Bさんが「そんな契約はしていない」と主張した場合、第三者(裁判所など)はどちらの言い分が正しいか判断できません。なぜなら、Bさんも同じ共通鍵を持っているため、「Aさんが自分で作った」のか「Bさんが自分で作った」のか区別がつかないからです。
この問題を「否認防止(Non-repudiation)ができない」と言います。
この最後の課題を解決するのが、次回解説する「デジタル署名」です。公開鍵暗号技術を応用することで、「この文書は確かにAさんが作成したものであり、Aさんは後から否定できない」という証明が可能になります。
学んだ知識を定着させよう
ここまでの内容が理解できたか、簡単なクイズで確認してみましょう。ハッシュ関数の性質や、MACが何を防ぐのか、といった点が試験の頻出ポイントです!
【演習】ハッシュ関数とMAC 理解度チェック(全10問・詳細解説付き)
Q1. ハッシュ関数の性質のうち、異なる入力データから同じハッシュ値が生成されることが非常に困難であるという性質はどれか。
正解:イ
解説:
異なるデータが同じハッシュ値になる現象を「衝突(コリジョン)」と呼び、それを見つけるのが難しい性質を「衝突困難性」と呼びます。これがデータの指紋として機能するための重要な条件です。
- ア(一方向性):ハッシュ値から元のデータを復元できない性質です。
- ウ(雪崩効果):入力が少し変わると出力が大きく変わる性質です。
- エ(危殆化):暗号技術の安全性が低下し、利用が推奨されなくなる状態のことです。
Q2. ハッシュ関数が主に保証する情報セキュリティの要素はどれか。
正解:イ
解説:
ハッシュ関数は、データが改ざんされていないこと、つまり「完全性」を保証するために用いられます。
- ア(機密性):データを盗聴から守る性質で、暗号化によって実現されます。
- ウ(可用性):システムをいつでも利用できる性質で、冗長化などで実現されます。
- エ(責任追跡性):誰が何をしたか追跡できる性質で、ログ管理などで実現されます。
Q3. 現在、安全なハッシュ関数として推奨されており、SSL/TLS証明書などでも広く利用されている規格はどれか。
正解:ウ
解説:
SHA-256はSHA-2ファミリーの一つで、現在最も広く使われている安全なハッシュ関数です。
- ア・イ(MD5, SHA-1):これらは既に衝突を見つける方法が発見されており、危殆化しているため非推奨です。
- エ(CRC32):誤り検出符号の一種ですが、意図的な改ざんを検知するセキュリティ目的には使えません。
Q4. メッセージ認証コード(MAC)が保証できるセキュリティ要素の組み合わせとして、正しいものはどれか。
正解:ウ
解説:
MACは、ハッシュ関数による「完全性(改ざん検知)」に加え、共通鍵を使うことで送信者が鍵を知る本人であるという「真正性(なりすまし検知)」も保証します。
- ア・エ(機密性):MAC自体はデータを暗号化しないため、機密性は保証しません。
- イ(完全性のみ):これはハッシュ関数(鍵なし)の説明です。MACは真正性も加わります。
Q5. メッセージ認証コード(MAC)の仕組みにおいて、送信者と受信者が事前に共有しておく必要がある鍵はどれか。
正解:ウ
解説:
MACは共通鍵暗号技術を応用しており、送信者と受信者が同じ「秘密の共通鍵」を持っていることを前提としています。
- ア・イ(秘密鍵・公開鍵):これらは公開鍵暗号方式やデジタル署名で使われる鍵です。
- エ(鍵は不要):鍵を使わない単純なハッシュ値だけでは、なりすましを防げません。
Q6. MACを利用しても防ぐことができない攻撃(実現できないセキュリティ機能)はどれか。
正解:ウ
解説:
MACは送信者と受信者が同じ鍵を共有しているため、「どちらが作成したか」を第三者に証明することができません。つまり「否認防止」ができません(デジタル署名が必要)。
- ア(改ざん):MACによって検知可能です(完全性)。
- イ(なりすまし):共通鍵を持っていない第三者は正しいMACを作れないため検知可能です(真正性)。
- エ(盗聴):これはMACの役割ではありませんが、MAC自体は暗号化しないため盗聴は防げません。
Q7. ハッシュ関数の「雪崩(アバランチ)効果」とは、どのような性質を指すか。
正解:イ
解説:
雪崩のように、小さな変化が大きな結果の違いを生むことからこう呼ばれます。この性質により、わずかな改ざんも確実に検知できます。
- ア:これは計算効率性の話です。
- ウ:これは「一方向性(原像計算困難性)」の説明です。
- エ:これはハッシュ関数の基本的な定義(固定長出力)ですが、雪崩効果ではありません。
Q8. Webサイトなどでユーザーのパスワードをデータベースに保存する際、そのまま保存せずにハッシュ化して保存する主な理由は何か。
正解:イ
解説:
ハッシュ関数の「元に戻せない(一方向性)」という性質を利用し、万が一データベースが流出しても、攻撃者が元のパスワードを知ることができないようにするのが最大の目的です。
- ア・ウ:これらは副次的な効果かもしれませんが、主な目的ではありません。
- エ:これはパスワードポリシーの設定による対策であり、ハッシュ化の目的とは異なります。
Q9. SSL/TLS通信において、MACは主にどのような役割で利用されているか。
正解:ウ
解説:
SSL/TLSでは、ハンドシェイクで共有した「共通鍵」を使ってMAC(具体的にはHMAC)を計算し、通信パケットごとに付与することで、通信途中の改ざんやなりすましを防いでいます。
- ア・エ:これらには主に「デジタル署名(公開鍵暗号)」が使われます。
- イ:これには「公開鍵暗号(RSAなど)」や「鍵交換アルゴリズム(DHなど)」が使われます。
Q10. ハッシュ関数「SHA-256」が出力するハッシュ値の長さ(ビット数)として正しいものはどれか。
正解:ウ
解説:
規格名の通り、SHA-256は常に「256ビット」の固定長のハッシュ値を出力します。
- ア(128ビット):主にMD5の出力長です。
- イ(160ビット):主にSHA-1の出力長です。
- エ(可変):ハッシュ関数の基本定義は「任意の長さの入力から、固定長の出力を得る」ことです。
まとめ — セキュリティの3本柱が揃った
今回は、データの「改ざん検知」と「なりすまし防止」の技術について解説しました。
ハッシュ関数は、データの「デジタル指紋」を作る技術です。一方向性、衝突困難性、雪崩効果という3つの性質により、わずかな改ざんも見逃しません。現在の標準規格はSHA-256です。
メッセージ認証コード(MAC)は、ハッシュ関数に「共通鍵」を組み合わせた技術です。データの完全性に加え、送信者の真正性も保証します。
ここまでで、情報セキュリティの3大要素のうち2つが揃いました。
- 機密性(Confidentiality):暗号化で実現
- 完全性(Integrity):ハッシュ関数・MACで実現
- 可用性(Availability):システム設計で実現
しかし、デジタル社会にはもう一つ重要な要素があります。それが「否認防止(Non-repudiation)」、つまり「後から『私はやっていない』と否定できないようにする」仕組みです。
次回は、この最後のピースとなる「デジタル署名」について解説します。公開鍵暗号とハッシュ関数を組み合わせた、デジタル世界の「印鑑」とも言える技術です。
いよいよ暗号技術の集大成。お楽しみに!