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

上級の解説は準備中のため、上級の内容を表示しています。

概要 — まず全体をつかむ

初級では「一方向の指紋」と捉えました。上級では、求められる性質・構成・正しい使い方へ。

詳細 — 1段階ずつ追う

求められる3つの困難性

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

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

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

正しい使い方

  • HMAC — 秘密鍵付きハッシュ。メッセージ認証(真正性)。長さ拡張攻撃も回避
  • パスワード保管 — 高速ハッシュはNG。bcrypt(適応的CPUコスト)や scrypt/argon2(メモリハード)+ソルト+ペッパー
  • Merkleツリー — 大きなデータを部分的に検証(分散ストレージ・ブロックチェーン)
  • 整合性・重複排除 — ファイルの同一性判定、コンテンツアドレス

⚠️ 落とし穴と攻撃

  • MD5/SHA-1の衝突 — 実際に偽造が可能に。使用しない
  • 誕生日攻撃 — 出力長の半分のビットで衝突が現実的に(256ビットなら128ビット相当)
  • 長さ拡張攻撃 — 単純な hash(secret‖message) は危険。HMACを使う
  • 単純ハッシュでのパスワード — ソルト無し・高速はレインボーテーブル/GPUに弱い
  • 切り詰め — 指紋を短く切ると衝突が起きやすくなる

関連する知識

理解度チェック

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

1. パスワードの保管に、SHA-256のような高速ハッシュをそのまま使うのが不適切な理由は?

2. 鍵付きハッシュで「本人が作った・改ざんされていない」を確かめる仕組みは?

3. 「指紋から元のデータを求められない」性質の呼び名はどれ?

4. 出力256ビットのハッシュで、誕生日攻撃により衝突がおよそ何ビット相当の労力で見つかりうるか?

5. SHA-3が採用しているハッシュの内部構成はどれ?

6. 単純な hash(secret‖message)(秘密と本文の連結)が危険なのはなぜで、代わりに何を使うべき?

7. scryptやargon2が、GPUによる大量総当たりを難しくするために計算に多くの記憶容量を要求する性質を何と呼ぶ?

8. 大きなデータを部分ごとにハッシュで検証でき、分散ストレージやブロックチェーンで使われる木構造を何と呼ぶ?