メインコンテンツへスキップ

← ブログ一覧へ

MD5 は安全?まだ使える用途・使えない用途

短い答え:攻撃者が関わる場面では MD5 は安全ではありません。高速で非セキュリティ用途には今も便利ですが、セキュリティツールとして扱うのは実際のリスクです。詳しく見ていきましょう。

この値はほかのツールでも照合できます。 hello という 1 語を私たちのハッシュ生成に通すと、MD5 は 5d41402abc4b2a76b9719d911017c592 になりました。どのマシンでも echo -n hello | md5sum を実行すれば同じ 32 文字が出ます —— そこがまさに問題です。MD5 は高速で決定的、しかもどこにでも実装があるため、事前計算表を持つ攻撃者は一瞬で引き当てます。同じ語の SHA-256 は 2cf24dba…938b9824 で、これが安全なのは長いからではなく、実用的な衝突攻撃が存在しないからです。パスワードにはどちらも不適切で、必要なのは bcrypt や Argon2 のように意図的に遅い関数です。

なぜ MD5 は破られたとされるのか

MD5 は衝突(異なる 2 つの入力が同じハッシュになる)に弱く、しかも安価に生成できます。これは「攻撃者が偽造できない何かをハッシュで証明する」用途をすべて壊します。さらに非常に高速なため、ハッシュ値の総当たりも容易です。

MD5 が今も安全に使える用途

  • 敵対者のいないチェックサム——ファイルの偶発的な破損検出や、キャッシュ/重複排除のキー。騙そうとする攻撃者がいない場面。
  • 内部・非セキュリティ目的の手早いフィンガープリント

MD5 を使うべきでない用途

  • パスワード——絶対に不可。SHA-256 単体でも不可。パスワードには bcrypt・scrypt・Argon2 のような低速でソルト付きのアルゴリズムが必要です。(さらに良いのは自作せず、フレームワークの認証を使うこと。)
  • デジタル署名・証明書・改ざん対策の完全性——SHA-256(SHA-2)や SHA-3 を。

詳しい比較は MD5 vs SHA を。

自分で試す

  • ハッシュ生成——MD5・SHA-1・SHA-256 などをブラウザ内で計算して比較。
  • 自分でハッシュ化せず強いランダムパスワードが欲しい?パスワード生成

結論:偶発エラー検出のチェックサムには MD5、完全性には SHA-256、認証情報には専用のパスワードハッシュ(bcrypt/Argon2)。

以下の各行は私たちのハッシュ生成ツールの出力で、どの行も手元で echo -n hello | md5sum で確認できます。そこが肝心です —— これらの値を信じてもらう必要はありません。 は末尾の空白 1 つを表します。

入力MD5
hello5d41402abc4b2a76b9719d911017c592
Hello8b1a9953c4611296a827abf8c47804d7
hell073b43f17232b391b9123adf40c1b65dd
hello␠f814893777bcc2295fff05f00e508da6
password5f4dcc3b5aa765d61d8327deb882cf99

MD5 はどう破られたか

MD5 は一夜で壊れたのではなく、20 年かけて亀裂が広がりました。

  • 1991 年——MD5 が公開され、128 ビット(16 進数 32 文字)のダイジェストを生成。
  • 1996 年——圧縮関数に初めて重大な弱点が見つかる。
  • 2004〜2005 年——研究者が数時間、やがて数分で完全な衝突を生成。
  • 2008 年——MD5 の衝突を利用して、機能する不正な認証局(CA)証明書が作られる。
  • 2012 年——マルウェア Flame が MD5 の「選択プレフィックス衝突」を用いて Microsoft のコード署名証明書を偽造。

この流れ自体が教訓です。衝突が安価になれば、現実の攻撃が続きます。SHA-1 も同じ道をたどり——最初の公開衝突は 2017 年——だからこそ新規開発では SHA-256 以上を使うべきです。

正しいアルゴリズムの選び方

アルゴリズム出力長状況用途
MD5128 ビット衝突が安価に破られている偶発的破損のチェックサム、キャッシュキー
SHA-1160 ビット衝突が破られている(2017)既存互換のみ——新規は回避
SHA-256(SHA-2)256 ビット安全完全性・署名・証明書
SHA-3224〜512 ビット安全SHA-2 の現代的な代替
bcrypt / scrypt / Argon2可変安全・意図的に低速パスワード

代替を選ぶことはダイジェスト幅を選ぶことで、入力 1 つで幅が具体的になります。hello は SHA-256 で

2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824

SHA-512 では

9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043

同じ 5 文字の入力に対して 64 桁 対 128 桁の 16 進 —— 256 ビット 対 512 ビットです。どちらもブラウザで気づくほどの計算速度差はないので、実務の規則は単純です。相互運用の相手が SHA-512 を求めない限り SHA-256。やってはいけないのは「幅の広いダイジェストを選んで、それをパスワードハッシュとして使い続ける」ことです。幅は遅さではなく、パスワード保存に必要なのは遅さです。

チェックサムを実際に検証する

ダウンロードページにハッシュが載っていれば、自分で計算して照合できます。

# 転送中に壊れていないかを確認するだけ
md5sum ubuntu.iso

# 改ざんの可能性がある場合はこちらを使う
sha256sum ubuntu.iso

MD5 が一致してもバイト列が無事に届いたと分かるだけで、誰かがファイルをすり替えていないことは証明できません。一致する MD5 は偽造できるからです。その保証が欲しければ、SHA-256 に署名を組み合わせます。

4 行目を見てください。hello の末尾に空白 1 つで、ハッシュは f814893777bcc2295fff05f00e508da6 になり、5d41402abc4b2a76b9719d911017c592 と共通部分はまったくありません。「チェックサムが合わない」という報告の多くは破損ではなくこれです。エディタが改行を足した、コピペが空白を拾った。そして最後の行は「MD5 をパスワードに使うな」を値 1 つで言い切ります —— 5f4dcc3b5aa765d61d8327deb882cf99password の MD5 で、公開されたレインボーテーブルすべてに載っています。その文字列を検索すれば平文が即座に出ます。衝突攻撃は要りません。

よくある質問

MD5 は暗号化?

いいえ。MD5 は一方向ハッシュで、鍵もなく「復号」するものもありません。いわゆる「MD5 復号」サイトは、あらかじめ計算したハッシュの対応表にすぎません。

ソルト付き MD5 ならパスワードに安全?

いいえ。ソルトは同じパスワードが同じハッシュになるのを防ぎ、レインボーテーブルを無効化しますが、MD5 は高速すぎて、データベースを握った攻撃者は毎秒数十億回の推測を試せます。bcrypt や Argon2 のような低速ハッシュを使いましょう——強いパスワードの作り方を参照。

ダウンロード元が MD5 チェックサムしか提供していない——無意味?

そんなことはありません。破損したダウンロードは確実に検出できます。ただし悪意あるすり替えには無力です。信頼できない相手なら SHA-256 と署名を優先しましょう。