MD5 / SHA-1がなぜ非推奨なのか|衝突攻撃の正体
「破られている」の意味
「MD5は破られている」とよく言われますが、何が起きているのかを理解せずに使うか避けるかを判断するのは危険です。
ハッシュ関数に対する攻撃は大きく3種類:
- 原像攻撃(preimage attack): ハッシュ値から元のデータを復元する
- 第二原像攻撃(second preimage attack): 与えられたデータと同じハッシュを持つ別のデータを作る
- 衝突攻撃(collision attack): 同じハッシュを持つ任意の2つのデータを作る
このうちMD5・SHA-1は衝突攻撃が現実的に成立しているため非推奨です。
MD5 の現状
衝突攻撃: 実用レベルで成立
2004年に最初の衝突が発見され、現在では数秒で衝突を作れます。
実例:
- 2008年: SSL証明書を偽造してCA署名を悪用(Mozilla等のCAルートに混ざる事案)
- 2010年: Flame マルウェアがMD5衝突を悪用してWindows Updateになりすまし
原像攻撃: まだ困難
「5d41...c592 というハッシュを持つ元データを復元」は依然として困難です。理論的に弱いとされていますが、現実的な攻撃には至っていません。
第二原像攻撃: まだ困難
「既存のファイルAと同じハッシュを持つファイルBを作る」も困難。ただし、攻撃者がAから自由に派生させられる場合は別問題(衝突攻撃と組み合わせ可能)。
SHA-1 の現状
衝突攻撃: 実用化済み
2017年、Googleが「SHAttered」攻撃で異なる2つのPDFが同じSHA-1ハッシュを持つ実例を公開しました。コストは数万ドル(GPU時間)相当。
その後、コストはさらに低下。GitHubも2017年以降「SHA-1衝突を含むPushを拒否する」機能を実装しています。
Gitはなぜまだ使えるのか
GitはSHA-1衝突対策された変種を使っており、SHAttered風の攻撃を検出して拒否します。完全にSHA-256に移行する作業も進行中(git config --global init.defaultBranch の議論と並行)。
ユーザレベルで日常使いするには問題ありません。
衝突攻撃が「具体的に何の問題」なのか
例: ファイル偽造
攻撃者が悪意のあるファイル evil.exe と無害なファイル safe.exe で同じMD5ハッシュを持つよう作る:
safe.exeを公開、ハッシュ値も公開- ユーザは
safe.exeのハッシュを確認してダウンロード - CDNが侵害されて中身が
evil.exeにすり替わる - ハッシュ値は同じなのでユーザは検知できない
これが衝突攻撃のリスク。SHA-256では現在この攻撃は現実的に不可能です。
例: SSL証明書偽造
CA(認証局)が発行する証明書と同じハッシュを持つ偽証明書を作れば、なりすましサイトが「正規のサイト」として振る舞えます。MD5で署名されたCAは2010年代初頭に廃止されました。
現代でもMD5・SHA-1を使う場面
MD5
- キャッシュキー: 攻撃者が衝突を作っても被害がない
- deduplication: 同上
- ファイル整合性チェック(信頼できる転送経路): ネットワーク誤りを検知する程度なら有効
- Etag: HTTPキャッシュ判定
SHA-1
- Git: 衝突対策版を使用、完全な置き換えは検討中
- HMAC-SHA1: HMACの構造により、衝突攻撃の影響を受けにくい
- レガシーシステム互換: 既存仕様で固定されている場合
これらの用途では「衝突攻撃が問題にならない」または「対策されている」ため、現状でも使われ続けています。
では、新規開発で選ぶなら
| 用途 | 推奨 |
|---|---|
| 認証・改ざん検知 | SHA-256 |
| データ識別子 | SHA-256(メモリ気にしないなら) |
| キャッシュ・短いID | MD5でもOK(衝突気にしないなら) |
| パスワード | bcrypt / argon2(ハッシュ関数を直接使わない) |
「MD5/SHA-1は新規で使わない」が原則ですが、用途を理解した上で使うのは禁止ではありません。
自分のコードで判断するチェックリスト
| 質問 | Yes → 強いハッシュ | No → 速いハッシュOK |
|---|---|---|
| 攻撃者がデータを操作できる? | SHA-256 | MD5でも可 |
| ハッシュ値が信頼の根拠になる? | SHA-256 | MD5でも可 |
| 長期的に検証する必要がある? | SHA-256/SHA-512 | MD5でも可 |
| 性能がボトルネック? | バランス検討 | MD5/SHA-1 |
**「攻撃者の存在を仮定するか」**が判断の起点です。
関連記事
「破られている」は「全否定」ではなく、「特定の攻撃が成立する」ということ。用途次第では使い続けても問題ない、という冷静な判断が大事です。