短い答え:攻撃者が関わる場面では 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-256、認証情報には専用のパスワードハッシュ(bcrypt/Argon2)。
以下の各行は私たちのハッシュ生成ツールの出力で、どの行も手元で echo -n hello | md5sum で確認できます。そこが肝心です —— これらの値を信じてもらう必要はありません。␠ は末尾の空白 1 つを表します。
| 入力 | MD5 |
|---|---|
hello | 5d41402abc4b2a76b9719d911017c592 |
Hello | 8b1a9953c4611296a827abf8c47804d7 |
hell0 | 73b43f17232b391b9123adf40c1b65dd |
hello␠ | f814893777bcc2295fff05f00e508da6 |
password | 5f4dcc3b5aa765d61d8327deb882cf99 |
MD5 はどう破られたか
MD5 は一夜で壊れたのではなく、20 年かけて亀裂が広がりました。
- 1991 年——MD5 が公開され、128 ビット(16 進数 32 文字)のダイジェストを生成。
- 1996 年——圧縮関数に初めて重大な弱点が見つかる。
- 2004〜2005 年——研究者が数時間、やがて数分で完全な衝突を生成。
- 2008 年——MD5 の衝突を利用して、機能する不正な認証局(CA)証明書が作られる。
- 2012 年——マルウェア Flame が MD5 の「選択プレフィックス衝突」を用いて Microsoft のコード署名証明書を偽造。
この流れ自体が教訓です。衝突が安価になれば、現実の攻撃が続きます。SHA-1 も同じ道をたどり——最初の公開衝突は 2017 年——だからこそ新規開発では SHA-256 以上を使うべきです。
正しいアルゴリズムの選び方
| アルゴリズム | 出力長 | 状況 | 用途 |
|---|---|---|---|
| MD5 | 128 ビット | 衝突が安価に破られている | 偶発的破損のチェックサム、キャッシュキー |
| SHA-1 | 160 ビット | 衝突が破られている(2017) | 既存互換のみ——新規は回避 |
| SHA-256(SHA-2) | 256 ビット | 安全 | 完全性・署名・証明書 |
| SHA-3 | 224〜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 つで言い切ります —— 5f4dcc3b5aa765d61d8327deb882cf99 は password の MD5 で、公開されたレインボーテーブルすべてに載っています。その文字列を検索すれば平文が即座に出ます。衝突攻撃は要りません。
よくある質問
MD5 は暗号化?
いいえ。MD5 は一方向ハッシュで、鍵もなく「復号」するものもありません。いわゆる「MD5 復号」サイトは、あらかじめ計算したハッシュの対応表にすぎません。
ソルト付き MD5 ならパスワードに安全?
いいえ。ソルトは同じパスワードが同じハッシュになるのを防ぎ、レインボーテーブルを無効化しますが、MD5 は高速すぎて、データベースを握った攻撃者は毎秒数十億回の推測を試せます。bcrypt や Argon2 のような低速ハッシュを使いましょう——強いパスワードの作り方を参照。
ダウンロード元が MD5 チェックサムしか提供していない——無意味?
そんなことはありません。破損したダウンロードは確実に検出できます。ただし悪意あるすり替えには無力です。信頼できない相手なら SHA-256 と署名を優先しましょう。