会社のセキュリティ教科書 第3部 3-2
ハッシュ関数とメッセージ認証とは|改ざんを見つける仕組み
公開:2026年10月15日/最終更新:同/Moshiru 岡﨑 悠太
こんなときに役立ちます
- ファイルが途中で書き換えられていないかを確かめる必要があるとき
- 「パスワードはどう保存していますか」と、取引先やシステム会社に聞かれたとき
- SGや支援士の勉強で、ハッシュ・MAC・デジタル署名の違いを整理したいとき
読み終えたあと、社内でこう言えます
「改ざんの確かめ方と、パスワードの保存方法を整理しました」
結論:ハッシュ関数は、データから短い「指紋」を作る計算です。1文字でも変わると指紋がまったく別の値になるため、改ざんを見つけられます。ただし指紋だけでは「誰が作ったか」までは分かりません。そこで鍵を混ぜたHMACやデジタル署名を使います。パスワードは暗号化ではなく、ソルトを加えた遅いハッシュで保存するのが基本です。
ハッシュ関数とは:データの「指紋」を作る計算
ハッシュ関数は、どんな長さのデータからも、決まった長さの値を作る計算です。できた値を「ハッシュ値」と呼びます。たとえばSHA-256は、1文字のメモからも1GBの動画からも、256ビットの値を作ります。
人の指紋と同じで、ハッシュ値から元のデータを作り直すことはできません。一方、同じデータからは必ず同じ値が出ます。安全なハッシュ関数には、次の3つの性質が求められます。
| 性質 | 意味 |
| 一方向性(原像計算困難性) | ハッシュ値から、元のデータを求められない。 |
| 第2原像計算困難性 | あるデータと同じハッシュ値になる、別のデータを見つけられない。 |
| 衝突困難性 | 同じハッシュ値になるデータの組を、どれでもよいから見つけることも難しい。 |
暗号化と混同しやすいので注意します。暗号化は鍵があれば元に戻せる計算です。ハッシュは誰にも元に戻せない計算です。「元に戻す必要がないが、同じかどうかは確かめたい」ときにハッシュを使います。
使ってよいハッシュ、やめるべきハッシュ
ハッシュ関数にも寿命があります。同じハッシュ値になる別のデータ(衝突)を作れてしまうと、偽物を本物と見分けられなくなるからです。
| 方式 | 今の扱い |
| SHA-2(SHA-256、SHA-384、SHA-512など) | 現在の主流。米国NISTのFIPS 180-4で定められ、CRYPTRECの電子政府推奨暗号リストにも載っている。 |
| SHA-3(SHA3-256など) | SHA-2と仕組みが異なる新しい方式。2015年にFIPS 202として標準化。同じくCRYPTRECの推奨リストに載っている。 |
| SHA-1 | 衝突攻撃が現実になり、NISTは2030年末までに使うのをやめる方針を2022年に発表。CRYPTRECでは互換性のためだけに認める「運用監視暗号リスト」。 |
| MD5 | 衝突が簡単に作れることが知られている。改ざん検知の目的では使わない。 |
CRYPTRECの推奨リストに載るハッシュ関数は、どれもハッシュ長が256ビット以上です。社内のシステムや取引先とのやり取りで、まだSHA-1やMD5に頼っている所がないかを確かめておくと安心です。
ファイルが書き換えられていないかを確かめる
ハッシュの一番身近な使い道は、ファイルの確認です。ソフトウェアの配布元が、ダウンロード用ファイルのハッシュ値(SHA-256など)を公開していることがあります。手元で計算した値と一致すれば、途中で書き換えられていないと分かります。
- 配布元の公式サイトで、公開されているハッシュ値と方式(SHA-256など)を確かめる。
- ダウンロードしたファイルのハッシュ値を、OSに付いている機能で計算する。WindowsならPowerShellの Get-FileHash、macOSなら shasum が使える。
- 2つの値を、先頭と末尾だけでなく全部の文字で照合する。1文字でも違えば使わない。
たとえば社員20人の設計事務所では(架空の例)
設計データを取引先と大容量ファイルでやり取りする事務所を考えます。以前、受け取ったデータの一部が壊れていて、図面の寸法が合わないことがありました。そこで、送る側が送信時にSHA-256のハッシュ値をチャットで伝え、受け取った側が計算して照合する決まりにしました。
この方法で、通信の途中での破損や差し替えに気づけます。ただしファイルとハッシュ値が同じ経路で届くと、両方を差し替えられたときに見抜けません。ハッシュ値は別の経路で伝えるか、配布元の公式サイトで確かめます。誰が作ったかまで証明したい場合は、デジタル署名を使います。
メッセージ認証コード(MAC):鍵を混ぜて「相手から届いた」を確かめる
ハッシュ関数は誰でも計算できます。そのため攻撃者がデータを書き換え、ハッシュ値も計算し直して付け替えると、受け取った側は気づけません。この弱点を補うのがメッセージ認証コード(MAC)です。
MACは、送る側と受け取る側だけが持つ共通鍵を混ぜて計算します。鍵を知らない人は、正しいMACを作れません。ハッシュ関数と鍵を組み合わせた方式をHMACと呼び、NISTのFIPS 198-1で定められています。クラウドサービスどうしのAPI連携など、見えない所で広く使われています。
| 仕組み | 改ざんの検知 | 誰が作ったか | 否認防止 |
| ハッシュ | できる(値が別経路で守られていれば) | 分からない | できない |
| MAC(HMACなど) | できる | 同じ鍵を持つ相手と分かる | できない |
| デジタル署名 | できる | 秘密鍵の持ち主と分かる | できる |
MACで否認防止(あとで「送っていない」と言わせないこと)ができないのは、送る側と受け取る側が同じ鍵を持つからです。受け取った側も同じMACを作れるため、第三者には「どちらが作ったか」を証明できません。
パスワードは「ソルト付きの遅いハッシュ」で保存する
自社のWebサービスや社内システムで、利用者のパスワードを保存することがあります。平文のまま保存すると、漏れた瞬間にすべてのパスワードが使われてしまいます。暗号化しても、鍵が一緒に盗まれれば元に戻されます。
そこで、パスワードはハッシュ値だけを保存します。ログインのときは、入力されたパスワードのハッシュ値を計算し、保存した値と比べます。ただし、ただハッシュにするだけでは足りません。
| 工夫 | 何を防ぐか |
| ソルト(利用者ごとのランダムな値を足してからハッシュ) | 同じパスワードが同じハッシュ値になるのを防ぐ。よく使われるパスワードのハッシュ値を並べた表(レインボーテーブル)が効かなくなる。 |
| ストレッチング(計算を何度も繰り返して遅くする) | 盗まれたハッシュ値から、総当たりでパスワードを探す作業を遅くする。 |
| 別に保管する秘密の鍵(ペッパーとも呼ばれる) | ハッシュ値のデータベースだけが盗まれても、照合の計算をさせない。 |
米国NISTのSP 800-63B-4(2025年7月)は、パスワードの保存方法を定めています。ソルトを付けたうえで、パスワード用の適切なハッシュ方式で保存するよう求めています。ソルトは32ビット以上とし、計算の重さ(コスト)は性能を損なわない範囲でできるだけ高くするとしています。方式は、PBKDF2を定めたSP 800-132などが参照先です。
中小企業が自分で実装することは少ないはずです。システム会社やサービスに「パスワードはソルト付きのハッシュで保存していますか」と聞けば十分です。社員側のパスワードの決め方はパスワードの決め方の手引きにまとめています。
チェックシートではこう聞かれる
| よくある設問 | 答え方の例 |
| システムで管理する利用者のパスワードは、ハッシュ化等をして保存していますか。 | はい。委託先のシステム会社に確認し、ソルト付きのハッシュで保存されていることを書面で受け取っています。 |
| 受け取ったデータやソフトウェアが改ざんされていないことを確認していますか。 | はい。ソフトウェアは公式サイトからのみ入手し、ハッシュ値が公開されているものは照合してから導入しています。 |
| 重要なデータの改ざんを検知する仕組みはありますか。 | いいえ。現在は未整備です。〇月までに、受け渡しの際にSHA-256のハッシュ値を別経路で伝える手順を定めます。 |
パスワードの保存方法を知らない場合は、推測で「はい」と書かず、まず委託先に確認します。書き方はチェックシートの回答の書き方も参考にしてください。
試験ではここが問われる
SG・支援士・Security+ 1・CISSP 3
- ハッシュの3つの性質:一方向性(原像計算困難性)・第2原像計算困難性・衝突困難性。どれが何を指すかの区別が問われます。
- ハッシュと暗号化の違い:ハッシュは元に戻せず、鍵も使わない。暗号化は鍵で元に戻せる。
- MACと署名の違い:MACは共通鍵を使い、改ざん検知と送信者の確認はできるが、否認防止はできない。否認防止にはデジタル署名を使う。
- パスワードの保存:ソルト=同じパスワードでも別の値にし、レインボーテーブルを防ぐ。ストレッチング=計算を重ねて総当たりを遅くする。
- 方式:SHA-2・SHA-3が現役、SHA-1とMD5は衝突が問題になり新規には使わない。英語ではhash、MAC、salt、key stretching。
確認問題
問1 ハッシュ関数の「衝突困難性」の説明として、最も適切なものはどれですか。
- ア ハッシュ値から元のデータを求めることが難しい
- イ 同じハッシュ値になる異なる2つのデータを見つけることが難しい
- ウ 鍵がなければハッシュ値を計算できない
- エ ハッシュ値から元のデータを鍵で復元できる
答えと解説
正解:イ 衝突とは、異なるデータから同じハッシュ値が出ることです。アは一方向性(原像計算困難性)の説明です。ハッシュ関数は鍵を使わず、元にも戻せないので、ウとエは誤りです。
問2 社員40人の通販会社(架空)が、会員サイトのパスワードを保存しています。漏えい時の被害を小さくする保存方法として、最も適切なものはどれですか。
- ア 全会員に共通の固定値を足して、SHA-256で1回だけハッシュ化する
- イ 共通鍵暗号で暗号化し、鍵を同じデータベースに保存する
- ウ 会員ごとに異なるソルトを付け、計算を重くしたパスワード用のハッシュ方式で保存する
- エ 平文のまま保存し、データベースへのアクセス権を絞る
答えと解説
正解:ウ 会員ごとのソルトで同じパスワードでも別の値になり、計算を重くすることで総当たりも遅くできます。アは全員に同じ値なので、ソルトの効果がほとんどありません。イは鍵ごと盗まれると戻されます。エは漏れた時点で全員のパスワードが使われます。
問3 HMACについて述べた文として、最も適切なものはどれですか。
- ア 送信者の秘密鍵で計算するので、否認防止ができる
- イ 共通鍵とハッシュ関数を使い、改ざんの検知と送信者の確認ができる
- ウ データを暗号化するので、通信の内容を秘密にできる
- エ 鍵を使わないので、誰でも正しい値を作れる
答えと解説
正解:イ HMACは共通鍵を混ぜたハッシュで、鍵を持つ相手が作ったことと改ざんがないことを確かめます。両者が同じ鍵を持つため、否認防止はできません(ア)。内容を秘密にする機能はありません(ウ)。
よくある質問
ハッシュ値が一致すれば、そのファイルは安全ですか?
一致して分かるのは、「配布元が公開したファイルと同じ」ということだけです。配布元そのものが乗っ取られていれば、悪いファイルとそのハッシュ値が並んでいることもあります。公式の入手先を使うこと、OSやウイルス対策の検査と組み合わせることが大切です。
パスワードを「暗号化して保存しています」と答えるのは間違いですか?
実際にハッシュで保存しているなら、「ハッシュ化して保存しています」と書く方が正確です。設問が「暗号化等」となっていれば、暗号化とハッシュのどちらで保存しているかを明記すると、相手に誤解されません。
MD5のハッシュ値しか公開されていないソフトはどうしますか?
MD5は衝突を作れるため、意図的な差し替えへの備えとしては弱いです。通信中の破損を見つける用途には役に立ちます。可能なら、SHA-256の値や電子署名を公開している入手先を選びます。
参考にした資料
- NIST「FIPS 180-4 Secure Hash Standard (SHS)」(2015年8月)
- NIST「FIPS 202 SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions」(2015年8月)
- NIST「FIPS 198-1 The Keyed-Hash Message Authentication Code (HMAC)」(2008年7月)
- NIST「NIST Retires SHA-1 Cryptographic Algorithm」(2022年12月)
- NIST「SP 800-63B-4 Digital Identity Guidelines: Authentication and Authenticator Management」(2025年7月)
- CRYPTREC「CRYPTREC暗号リスト(電子政府推奨暗号リスト)」CRYPTREC LS-0001-2022R2(2026年3月30日改定)