MD5 / SHA-1 / SHA-256 を実務でどう使い分けるか

約7分

ハッシュ関数は同じインターフェース(任意長の入力 → 固定長の出力)を持つ仲間ですが、安全性と性能の特性が大きく違います。「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秒間に数十億回のハッシュ計算を試せてしまいます。

パスワードには意図的に遅いハッシュ関数を使います:

関数特徴
bcrypt1999 年から使われる定番。コストパラメータで難しさを調整可能
scryptメモリも消費する設計で、GPU/ASIC 攻撃に強い
Argon22015 年の Password Hashing Competition 優勝者。現代の推奨

新規プロジェクトなら Argon2id が第一候補で、利用環境にライブラリが無ければ bcrypt が次点です。

用途別の選び方まとめ

用途推奨備考
ファイル整合性(攻撃者なし)MD5 でも可速度優先なら MD5、迷ったら SHA-256
署名・改ざん検出SHA-256MD5/SHA-1 はNG
キャッシュキーMD5 / SHA-1 / SHA-256 のどれでも速度と長さで選ぶ
パスワード保管Argon2id / bcryptSHA-256 直接はNG
API トークンの生成crypto.randomBytesハッシュではなく乱数
ブロックチェーンSHA-256 / Keccak-256プロトコルが指定

ファイルやテキストのハッシュ値を試しに計算したい場合、本サイトのハッシュジェネレータで MD5 / SHA-1 / SHA-256 を同時に表示できるので、用途と性能のトレードオフを比較したいときに使えます。