前回までの記事で、データを「盗聴」から守るための暗号化技術について学んできました。共通鍵暗号、公開鍵暗号、そしてそれらを組み合わせたハイブリッド暗号(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(メッセージ認証コード)」は、データの完全性や真正性を担保する暗号技術の要として頻出する重要テーマです。
以下の練習問題は、ハッシュ関数の性質(一方向性や衝突困難性など)から、MACの仕組みやデジタル署名との違いまで、試験で問われやすいポイントを網羅した全10問です。
選択肢をクリックするとその場で正誤判定と解説が表示されます。正解以外の選択肢が「なぜ間違っているのか」も併せて確認し、本番に向けた知識の定着に役立ててください。
まとめ — セキュリティの3本柱が揃った
今回は、データの「改ざん検知」と「なりすまし防止」の技術について解説しました。
ハッシュ関数は、データの「デジタル指紋」を作る技術です。一方向性、衝突困難性、雪崩効果という3つの性質により、わずかな改ざんも見逃しません。現在の標準規格はSHA-256です。
メッセージ認証コード(MAC)は、ハッシュ関数に「共通鍵」を組み合わせた技術です。データの完全性に加え、送信者の真正性も保証します。
ここまでで、情報セキュリティの3大要素のうち2つが揃いました。
- 機密性(Confidentiality):暗号化で実現
- 完全性(Integrity):ハッシュ関数・MACで実現
- 可用性(Availability):システム設計で実現
しかし、デジタル社会にはもう一つ重要な要素があります。それが「否認防止(Non-repudiation)」、つまり「後から『私はやっていない』と否定できないようにする」仕組みです。
次回は、この最後のピースとなる「デジタル署名」について解説します。公開鍵暗号とハッシュ関数を組み合わせた、デジタル世界の「印鑑」とも言える技術です。
いよいよ暗号技術の集大成。お楽しみに!