前回までの記事で、データを「盗聴」から守るための暗号化技術について学んできました。共通鍵暗号、公開鍵暗号、そしてそれらを組み合わせたハイブリッド暗号(SSL/TLS)。これで盗聴への備えができました。
しかし、ここで一つ重要な疑問が浮かびます。
「暗号化されたデータが、途中で書き換えられていたらどうなるのか?」
実は、暗号化だけではこの問題を解決できません。悪意ある第三者が通信途中でデータを書き換え、受信者に届いたデータが「100万円の送金」から「1000万円の送金」に変わっていたとしても、暗号化だけでは気づけないのです。
そこで登場するのが、今回のテーマである「ハッシュ関数」と「メッセージ認証コード(MAC)」です。
この技術は、データに「デジタル指紋」を付けることで、わずか1文字の改ざんでも結果が大きく変わるため、改ざんを検知できます。SSL/TLS、ブロックチェーン、パスワード管理システムなど、現代のセキュリティ技術の根幹を支える仕組みです。
今回は、この「改ざん検知」の技術を、実例を交えながら徹底的に解説していきます。
ハッシュ関数とは?「データの指紋」を作る魔法の計算式
1冊の本も1行の文章も、同じ長さの「指紋」に変換される
ハッシュ関数(Hash Function)を一言で表現するなら、「どんなデータも固定長の文字列に変換する、一方通行の計算式」です。
例えば、「こんにちは」という5文字の文章(UTF-8)をSHA-256というハッシュ関数で処理すると、以下の64文字の文字列(16進数表記)に変換されます。
125aeadf27b0459b8760c13a3d80912dfa8a81a68261906f60d87f4a0268646c
驚くべきことに、100ページの論文をSHA-256で処理しても、出力される文字列は同じ64文字です。この「固定長に変換する」という特性が、データの完全性を効率的に検証する鍵となっています。
ハッシュ関数が持つ3つの「魔法の性質」
ハッシュ関数がセキュリティ技術として機能するのは、以下の3つの性質(一方向性、第2原像計算困難性、衝突発見困難性)があるからです。これらは情報処理技術者試験でも頻出の重要ポイントです。
性質1:一方向性(原像計算困難性)で元のデータに戻させない
ハッシュ値から元のデータを逆算することは、計算量的に現実的ではない(事実上不可能)です。
例えば、あなたのパスワード「MySecret123」をSHA-256でハッシュ化すると、特定のハッシュ値が生成されます。このハッシュ値を「逆算」して元のパスワードを求める方法はありません。ただし、攻撃者は候補のパスワードを片っ端からハッシュ化して一致するものを探す(総当たり・辞書攻撃)ことはできるため、推測されやすい短いパスワードは見つかってしまいます。一方向性は「逆算できない」という意味であり、「どんなパスワードも絶対に割り出せない」という意味ではない点に注意してください。
これが、Webサービスが「パスワードを忘れた場合は再発行」という対応をする理由です。運営側もハッシュ値しか保存していないため、元のパスワードを知ることができないのです。
この「不可逆」な性質を「一方向性」と呼びます。
性質2:第2原像計算困難性(弱衝突耐性)で同じ指紋の偽物を作らせない
あるデータとそのハッシュ値が与えられたとき、同じハッシュ値になる別のデータを見つけることが計算量的に困難である性質です。弱衝突耐性とも呼ばれます。
例えば、配布されているソフトウェアとそのハッシュ値が公開されている場合、攻撃者が「同じハッシュ値になる改ざん版」を作れてしまうと、ハッシュ値の照合では改ざんを見抜けません。この性質があるからこそ、ハッシュ値の一致によって「元のデータと同じである」と判断できるのです。
性質3:衝突発見困難性(強衝突耐性)で同じ指紋のペアを見つけさせない
理論上、無限のデータを有限の長さ(例:256ビット)に変換するため、異なるデータなのに同じハッシュ値が生成される現象(衝突(コリジョン))は避けられません。
しかし、SHA-256の出力は256ビットで、ハッシュ値の種類は2の256乗(約10の77乗)通りあります。誕生日のパラドックスを利用しても、衝突するペアを見つけるにはおよそ2の128乗回の計算が必要とされ、現在の計算能力では事実上不可能です。
このように、入力を自由に選んでもよいから「同じハッシュ値になる2つの異なるデータの組」を見つけることが非常に難しい性質を「衝突発見困難性」(強衝突耐性、単に衝突困難性とも)と呼びます。第2原像計算困難性が「特定のデータに対する偽物」を作らせない性質であるのに対し、こちらは「どんな組でもよいから衝突を見つける」ことすら困難であるという、より強い要求です。
補足:雪崩効果(アバランチ効果)で1文字の違いも指紋が激変する
元のデータがほんの1ビット変わるだけで、生成されるハッシュ値は完全に異なるものになります。
例えば、以下の2つの文章を比較してみましょう。
「100万円を送金する」
「100万円を送金した」(「する」→「した」に変更)
たった1文字の違いですが、それぞれのSHA-256ハッシュ値は、全く似ていない別物になります。共通する部分はほぼゼロです。
この性質のおかげで、データのわずかな改ざんも検知できるのです。この現象を「雪崩効果(Avalanche Effect)」と呼びます。雪崩効果は上記3性質とは別に、よく設計されたハッシュ関数が備える特性として押さえておきましょう。
テンプレート集
+おまけ:毎日1通の無料メール講座つき。登録した日が「1日目」、図解と論理で16週間かけて基礎も固まります。
主要なハッシュ関数の進化史:MD5からSHA-3まで
危殆化した旧世代:MD5とSHA-1
かつて広く使われていた「MD5」(1991年開発)と「SHA-1」(1995年開発)は、現在ではセキュリティ上使用すべきではない規格とされています。
2017年、GoogleとCWI Amsterdamの研究チームが実際にSHA-1の衝突を発見したことで、その脆弱性が実証されました。MD5に至っては、一般的なPCでも数秒〜数分で衝突を見つけられるレベルまで解析技術が進んでいます。
これを「危殆化(きたいか)」と呼び、古い規格は新しい規格に移行する必要があります。
現在の標準:SHA-2ファミリー(SHA-256が主流)
現在、世界中で最も広く使われているのが「SHA-2」ファミリーです。
特にSHA-256は、以下のような重要なシステムで標準採用されています。
SSL/TLS証明書(Webサイトのhttps通信)
ビットコイン・ブロックチェーン
電子署名システム
SHA-2には、出力ビット長によって複数のバリエーション(SHA-224、SHA-256、SHA-384、SHA-512)がありますが、実装・対応製品が最も多いSHA-256が主流です。
次世代規格:SHA-3
2015年に標準化されたSHA-3は、SHA-2とは全く異なる数学的アルゴリズム(スポンジ構造)を採用しています。これは、将来SHA-2に脆弱性が発見された場合の「保険」として開発されました。
SHA-3はSHA-2を置き換えるものではなく、NISTもSHA-2を引き続き承認済みのハッシュ関数としています。現在はSHA-2で十分安全であり、SHA-3は「代替手段」として併存している位置づけです。
メッセージ認証コード(MAC)でハッシュ関数の弱点を克服する
ハッシュ関数だけでは「なりすまし」を防げない
ここまで読んで、「ハッシュ関数だけで改ざん検知は完璧では?」と思われるかもしれません。
しかし、重大な問題があります。誰でもハッシュ値を計算できるという点です。
具体例で考えてみましょう。
Aさんが「100万円を送金する」というメッセージとそのハッシュ値をBさんに送る
悪意のある攻撃者Cさんが通信を傍受し、メッセージを「1000万円を送金する」に書き換える
Cさんは書き換えた新しいメッセージのハッシュ値を計算し、それをBさんに送る
Bさんは受け取ったメッセージとハッシュ値を照合し、「一致した=改ざんなし」と判断してしまう
このように、ハッシュ関数だけでは「誰が作成したメッセージか」を証明できないのです。
「共通鍵」を混ぜることで真正性を確保する
この問題を解決するのが「メッセージ認証コード(MAC: Message Authentication Code)」です。
MACは、メッセージと「秘密の共通鍵」から認証用の値(MAC値)を計算する技術です。代表的な実装方式に、ハッシュ関数を使うHMAC(Hash-based MAC)があります(ほかにブロック暗号を使うCMACなどもあります)。
仕組みを順を追って説明します。

ステップ1:事前準備
送信者Aさんと受信者Bさんは、あらかじめ秘密の共通鍵Kを安全な方法で共有しておきます(例:対面で交換、公開鍵暗号で送信など)。
ステップ2:MAC生成(送信側)
Aさんは、送信したいメッセージMと共通鍵Kを組み合わせて、特別なハッシュ値(MAC)を計算します。
MAC = Hash(K + M)
本質は「鍵とメッセージを混ぜてハッシュ化する」ことです。ただし、この単純な形はSHA-256などで伸長攻撃(length extension attack)を受けるため、実際のHMACは鍵を加工して2回ハッシュ化する構造(RFC 2104)になっています。
ステップ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://」で始まっていれば、ブラウザとサーバー間で送受信される全てのデータに対してMACが計算され、改ざんがないか常時チェックされています。TLS 1.2以前の暗号スイートではHMACが広く使われてきましたが、現行のTLS 1.3では、暗号化と改ざん検知を同時に行うAEAD(AES-GCMやChaCha20-Poly1305)が認証タグ(MACに相当)を付けて改ざんを検知します(HMACは鍵導出のHKDFなどで引き続き使われています)。
2. パスワード管理システム
多くのWebサービスは、ユーザーのパスワードをそのまま保存せず、ハッシュ化して保存しています。このとき、ユーザーごとのランダムな値(ソルト)を付け、PBKDF2・bcrypt・Argon2のように意図的に計算を遅くした方式(ストレッチング)を使うのが推奨です。SHA-256を1回かけるだけでは高速すぎて総当たりに弱いためです。これにより、万が一データベースが漏洩しても、元のパスワードを割り出されにくくなります。
3. ブロックチェーン・暗号資産
ビットコインなどの暗号資産は、SHA-256を使って取引データの完全性を保証しています。過去の取引データが改ざんされると、ハッシュ値が変わるため即座に検知されます。
4. ソフトウェアのダウンロード検証
公式サイトからソフトウェアをダウンロードする際、「SHA-256ハッシュ値」が併記されていることがあります。これは、ダウンロードしたファイルが改ざんされていないか、自分で検証するための情報です。
MACの限界と次なる課題「否認防止」
ここまで読むと、MACで全ての問題が解決したように思えますが、実は一つ重要な制約があります。
それは、「共通鍵」を使っているため、送信者と受信者の両方がMAC値を作成できるという点です。
例えば、AさんがBさんに「100万円を支払う」という注文データとMAC値を送ったとします。後日、Aさんが「そんな注文は送っていない」と主張した場合、BさんがMAC値を示しても、第三者(裁判所など)はどちらの言い分が正しいか判断できません。なぜなら、Bさんも同じ共通鍵を持っているため、そのMAC値を「Aさんが作った」のか「Bさんが自分で作った(偽造した)」のか区別がつかないからです。
この問題を「否認防止(Non-repudiation)ができない」と言います。
この最後の課題を解決するのが、次回解説する「デジタル署名」です。公開鍵暗号技術を応用することで、「この文書は確かにAさんが作成したものであり、Aさんは後から否定できない」という証明が可能になります。
【練習問題】ハッシュ関数とMAC(情報処理安全確保支援士 対策)
情報処理安全確保支援士試験において、「ハッシュ関数」と「MAC(メッセージ認証コード)」は、データの完全性や真正性を担保する暗号技術の要として頻出する重要テーマです。
以下の練習問題は、ハッシュ関数の性質(一方向性や衝突困難性など)から、MACの仕組みやデジタル署名との違いまで、試験で問われやすいポイントを網羅した全10問です。
選択肢をクリックするとその場で正誤判定と解説が表示されます。正解以外の選択肢が「なぜ間違っているのか」も併せて確認し、本番に向けた知識の定着に役立ててください。
まとめ:セキュリティの3本柱のうち2本が揃った
今回は、データの「改ざん検知」と「なりすまし防止」の技術について解説しました。
ハッシュ関数は、データの「デジタル指紋」を作る技術です。一方向性、第2原像計算困難性、衝突発見困難性という3つの性質に加え、雪崩効果によって、わずかな改ざんも検知できます。現在の主流はSHA-2ファミリーのSHA-256です。
メッセージ認証コード(MAC)は、メッセージに「共通鍵」を組み合わせて認証用の値を作る技術です(代表例はハッシュ関数を使うHMAC)。データの完全性に加え、送信者の真正性も保証します。
ここまでで、情報セキュリティの3大要素のうち2つが揃いました。
機密性(Confidentiality):暗号化で実現
完全性(Integrity):ハッシュ関数・MACで実現
可用性(Availability):システム設計で実現
しかし、デジタル社会にはもう一つ重要な要素があります。それが「否認防止(Non-repudiation)」、つまり「後から『私はやっていない』と否定できないようにする」仕組みです。
次回は、この最後のピースとなる「デジタル署名」について解説します。公開鍵暗号とハッシュ関数を組み合わせた、デジタル世界の「印鑑」とも言える技術です。
いよいよ暗号技術の集大成。お楽しみに!
テンプレート集
+おまけ:毎日1通の無料メール講座つき。登録した日が「1日目」、図解と論理で16週間かけて基礎も固まります。