ハッシュ — データの指紋(改ざん検知)

概要 — まず全体をつかむ

初級では「一方向の指紋」と捉えました。中級では、求められる性質と、正しい使い分けを見ます。

詳細 — 1段階ずつ追う

一方向性の中身

安全なハッシュは、次を満たします。

  • 一方向 — データ → 指紋は作れるが、指紋 → データには戻せない
  • 衝突困難 — 同じ指紋になる別のデータを、現実的に作れない
  • 固定長 — どんな長さの入力も、決まった長さの指紋に

代表は SHA-2(SHA-256)MD5・SHA-1 は衝突が見つかっており非推奨です。

この部分をもっと深く(上級

安全なハッシュは、次が「現実的に不可能」であることを求められます。

  • 原像困難 — 指紋から元データを求められない
  • 第2原像困難 — 同じ指紋になる別データを作れない
  • 衝突困難 — 同じ指紋になる2つのデータの組を見つけられない

構成には、Merkle-Damgård(SHA-2)やスポンジ(SHA-3)があります。

やさしく言うと(初級

どんな長さのデータも、決まった長さの値(指紋)に変換します。

  • 一方向 — データ → 指紋 は作れるが、指紋 → データ には戻せない
  • 同じ入力は同じ指紋 — 照合に使える
  • 少しでも違えば全く違う指紋 — 改ざんが一目で分かる

代表は SHA-256 など。

アニメーション『ハッシュ=データの指紋』を開く
ハッシュ = データの指紋入力データ(長さは自由)固定長の指紋(ダイジェスト)ハッシュ関数SHA-256 などa3f1…9cハッシュ関数SHA-256 など7b20…e4たった1文字違い→ 指紋は全く別物どんな長さでも→ 固定長入力が1文字でも10万字でも、指紋の長さは常に同じ少し違うと→ 全然違う1文字の違いで指紋が激変。だから改ざんが一目で分かる指紋 → 元データ元データ指紋指紋から元へは戻せない(一方向=暗号化とは別物)

用途で使い分ける

「同じか・変わっていないか」を確かめる道具として、用途が分かれます。

  • 改ざん検知・整合性 — 受け取ったデータの指紋を照合。重複排除にも
  • パスワード保管 — 高速ハッシュ(SHA-256単体)はNG。bcrypt/scrypt/argon2のような専用関数+ソルトを使う
  • HMAC — 秘密鍵を組み合わせた鍵付きハッシュ。「本人が作った・改ざんなし」を確かめる(真正性)
アニメーション『雪崩効果とソルト(レインボーテーブル無効化)』を開く
雪崩効果とソルト少し変える/人ごとに変える、で指紋を作り分ける① 雪崩効果 — 入力を1文字変えると指紋は全く別物Tokyo2024ハッシュ3af9…1cTokyo2025ハッシュb7e0…44たった1文字違い→ 指紋は激変(別物)規則性が読めないので、指紋から入力を推測できない② ソルト — 同じパスワードでも人ごとに別の指紋ソルトなし(危険)Aさん:pw123Bさん:pw123ハッシュ両者とも同じ9f2a…7d同じパスワード → 同じ指紋「指紋→元」の対応表(レインボーテーブル)で一発照合されてしまう使い回し攻撃にも弱いソルトあり(安全)pw123 + 🧂ソルトAAさんHc1d4…22pw123 + 🧂ソルトBBさんH6a0f…be同じパスワードでも → 別々の指紋事前計算した対応表(レインボーテーブル)が無効になる1文字違えば指紋は激変(雪崩効果)/人ごとに違うソルトを足せば、同じパスワードでも別の指紋になる
この部分をもっと深く(上級
  • HMAC — 秘密鍵付きハッシュ。メッセージ認証(真正性)。長さ拡張攻撃も回避
  • パスワード保管 — 高速ハッシュはNG。bcrypt(適応的CPUコスト)や scrypt/argon2(メモリハード)+ソルト+ペッパー
  • Merkleツリー — 大きなデータを部分的に検証(分散ストレージ・ブロックチェーン)
  • 整合性・重複排除 — ファイルの同一性判定、コンテンツアドレス
やさしく言うと(初級
  • 改ざん検知 — 受け取ったデータの指紋を照合し、書き換えを見抜く
  • パスワード保管 — パスワードそのものでなく、指紋を保存(漏れても元が分かりにくい)
  • 重複検出・整合性 — ファイルが同じかを指紋で比較

暗号化と違い「戻す」用途ではなく、「同じか・変わっていないか」を確かめる道具です。

⚠️ 気をつける

  • 暗号化ではない — 秘密にするためではない(戻せない)
  • パスワードに高速ハッシュ+ソルト無し — 総当たり・レインボーテーブルに弱い
  • 古い方式 — MD5・SHA-1は使わない(衝突が現実的)
  • 切り詰め — 指紋を短く切ると衝突しやすくなる
この部分をもっと深く(上級
  • MD5/SHA-1の衝突 — 実際に偽造が可能に。使用しない
  • 誕生日攻撃 — 出力長の半分のビットで衝突が現実的に(256ビットなら128ビット相当)
  • 長さ拡張攻撃 — 単純な hash(secret‖message) は危険。HMACを使う
  • 単純ハッシュでのパスワード — ソルト無し・高速はレインボーテーブル/GPUに弱い
  • 切り詰め — 指紋を短く切ると衝突が起きやすくなる
やさしく言うと(初級
  • 暗号化ではない — 秘密にするためではない(戻せない)
  • パスワードはソルト付き — そのままハッシュだと使い回し攻撃に弱い。個別のソルトを足す
  • 古い方式 — MD5・SHA-1は弱い(衝突が見つかった)。SHA-2以降を使う

関連する知識

理解度チェック

そのまま解けます(成績は保存されません)。無料アカウントを作ると、学習の記録と進捗の山登りが始まります。

1. かつて広く使われたが衝突が見つかり、いまは使うべきでないハッシュを英字と数字3文字で1つ。

2. 秘密鍵を組み合わせた鍵付きハッシュで「本人が作った・改ざんなし」(真正性)を確かめる仕組みを英字4文字で。

3. ハッシュが改ざん検知に使える性質を、より正確に言うと?

4. パスワードをハッシュで保管するとき、利用者ごとに必ず足すべきものは?

5. ハッシュと暗号化の決定的な違いはどれ?

6. 現在も推奨される代表的なハッシュはどれ?

7. ハッシュの「固定長」とはどういう意味?

8. パスワード保管でSHA-256単体(高速ハッシュ)を使うのが不適切な理由は?