MD5 / SHA-1 / SHA-256 を実務でどう使い分けるか
ハッシュ関数は同じインターフェース(任意長の入力 → 固定長の出力)を持つ仲間ですが、安全性と性能の特性が大きく違います。「MD5 でいいや」と書きそうになる場面で、それが本当に妥当な選択かを判断できる材料を整理します。
ハッシュ関数の3つの性質
ハッシュ関数の暗号学的な性質は3つに分けられます。
| 性質 | 内容 | 破られると何が起きる |
|---|---|---|
| 原像計算困難性 | ハッシュ値から元の入力を求められない | パスワードハッシュが意味を失う |
| 第二原像計算困難性 | 同じハッシュ値を持つ別の入力を作れない | 改ざん検出が無効になる |
| 衝突耐性 | 同じハッシュ値を持つ任意の2入力を作れない | 署名の偽造が可能になる |
「衝突耐性」が一番強い性質で、これが破られていれば他の性質も実質危ない、と理解しておくとよいです。
MD5:チェックサムなら可、セキュリティ用途は不可
MD5 は 128 bit のハッシュを出力する古典的な関数です。
- 状況:2004 年に衝突が現実的に作れることが示された
- 2008 年:衝突を悪用した偽の SSL 証明書が作られた
- 現在:衝突攻撃は数秒〜数分で実行可能
衝突耐性が完全に破れているため、署名・改ざん検出など「攻撃者がいる」場面では絶対に使ってはいけません。
ただし「攻撃者がいない場面のチェックサム」としてはまだ使われます:
- ファイル転送の整合性チェック(伝送エラー検出)
- キャッシュキーの生成
- データベースのレコード比較
これらは「悪意のある人が衝突を作って攻撃する」シナリオが無いので、MD5 の高速性だけが効きます。
SHA-1:原則使わない
SHA-1 は 160 bit のハッシュを出力します。
- 2017 年:Google と CWI が実際の衝突を発表(“SHAttered” 攻撃)
- 2020 年:選択プレフィックス衝突が実用的に
- 現在:すべての主要ブラウザ・認証局が SHA-1 証明書を拒否
Git の内部識別子としては今も SHA-1 が使われていますが(Git 自体は徐々に SHA-256 への移行中)、新規実装では SHA-1 を選ぶ理由は無いと考えてよいです。
SHA-256:現代の標準
SHA-256 は SHA-2 ファミリーの代表で、256 bit のハッシュを出力します。
- 設計:MD5 や SHA-1 と異なる構造(Merkle-Damgård + 異なる圧縮関数)
- 既知の弱点:実用的な衝突攻撃は知られていない
- 性能:MD5 より遅いが、現代の CPU では十分速い(AES-NI 同様、専用命令を持つ CPU もある)
- 用途:TLS 証明書、署名、ブロックチェーン、改ざん検出など標準的な選択肢
「とりあえずどのハッシュにする?」と聞かれたら SHA-256 が無難な答えです。
SHA-3 / BLAKE3 はどう違うのか
選択肢として SHA-3 系(NIST 標準化)と BLAKE3(コミュニティ標準)もあります。
- SHA-3:SHA-2 と全く違う構造(Sponge construction)。SHA-2 が将来破られた場合の保険的存在
- BLAKE3:並列化に強く、SHA-256 より圧倒的に速い(数倍〜十数倍)。Rust 製ハッシュ関数で人気
実務で SHA-256 を置き換える積極的理由は今のところ少ないですが、大量のデータを高速にハッシュしたい用途では BLAKE3 の採用も増えています。
パスワードハッシュには専用関数を使う
ここで重要:パスワードを SHA-256 で直接ハッシュするのは間違いです。
ハッシュ関数(SHA-256 含む)は意図的に速いように作られています。これはチェックサム用途では利点ですが、パスワード保管では欠点で、攻撃者が GPU で1秒間に数十億回のハッシュ計算を試せてしまいます。
パスワードには意図的に遅いハッシュ関数を使います:
| 関数 | 特徴 |
|---|---|
| bcrypt | 1999 年から使われる定番。コストパラメータで難しさを調整可能 |
| scrypt | メモリも消費する設計で、GPU/ASIC 攻撃に強い |
| Argon2 | 2015 年の Password Hashing Competition 優勝者。現代の推奨 |
新規プロジェクトなら Argon2id が第一候補で、利用環境にライブラリが無ければ bcrypt が次点です。
用途別の選び方まとめ
| 用途 | 推奨 | 備考 |
|---|---|---|
| ファイル整合性(攻撃者なし) | MD5 でも可 | 速度優先なら MD5、迷ったら SHA-256 |
| 署名・改ざん検出 | SHA-256 | MD5/SHA-1 はNG |
| キャッシュキー | MD5 / SHA-1 / SHA-256 のどれでも | 速度と長さで選ぶ |
| パスワード保管 | Argon2id / bcrypt | SHA-256 直接はNG |
| API トークンの生成 | crypto.randomBytes | ハッシュではなく乱数 |
| ブロックチェーン | SHA-256 / Keccak-256 | プロトコルが指定 |
ファイルやテキストのハッシュ値を試しに計算したい場合、本サイトのハッシュジェネレータで MD5 / SHA-1 / SHA-256 を同時に表示できるので、用途と性能のトレードオフを比較したいときに使えます。