基礎知識 · テキスト・データ・セキュリティ
MD5 と SHA-256 の違いは?
結論
MD5 と SHA-256 は、どんな入力も固定長のフィンガープリント(MD5 は 128 ビット、SHA-256 は 256 ビット)に変換するハッシュ関数です。MD5 は、攻撃者が同じハッシュ値を持つ2つの異なるファイルを作れるため、セキュリティ用途では破られています。SHA-256 には現実的な攻撃は知られておらず、署名や完全性チェックの標準になっています。偶発的な破損の検出なら MD5 でもまだ使えますが、どちらもパスワードをそのまま保存する用途には向きません。
ハッシュ生成を開くハッシュ関数の役割
暗号学的ハッシュ関数は、任意のサイズの入力から固定サイズのダイジェストを返します。同じ入力からは常に同じダイジェストが得られ、1文字変わるだけでまったく別のダイジェストになり、ダイジェストから入力を復元することはできません。
| 入力 | MD5 | SHA-256 |
|---|---|---|
abc | 900150983cd24fb0d6963f7d28e17f72 | ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad |
| 空文字列 | d41d8cd98f00b204e9800998ecf8427e | e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 |
安全なハッシュは3種類の攻撃に耐える必要があります。与えられたダイジェストになる入力を見つける攻撃(原像攻撃)、与えられた入力と同じダイジェストになる別の入力を見つける攻撃(第二原像攻撃)、同じダイジェストになる任意の2つの入力を見つける攻撃(衝突攻撃)です。最も簡単なのは衝突で、理想的な n ビットのハッシュでも、誕生日のパラドックスにより約 2^(n/2) 回の試行で見つかります。
MD5・SHA-1・SHA-256・SHA-3 の比較
| アルゴリズム | ダイジェスト長 | 16進数の桁数 | 現状 |
|---|---|---|---|
| MD5(1992年) | 128 ビット | 32 | 2004年から衝突が現実的に。セキュリティ用途では破られている |
| SHA-1(1995年) | 160 ビット | 40 | 2017年に初の衝突が公開。NIST は2030年までに廃止予定 |
| SHA-256(SHA-2、2001年) | 256 ビット | 64 | 安全。FIPS 180-4 で標準化 |
| SHA-512(SHA-2) | 512 ビット | 128 | 安全。64 ビット CPU では SHA-256 より速いことが多い |
| SHA3-256(2015年) | 256 ビット | 64 | 安全。内部設計が異なり、FIPS 202 で標準化 |
SHA-256 は SHA-2 ファミリーの1つです。「SHA-2」と「SHA-256」はよく同じ意味で使われますが、SHA-224、SHA-384、SHA-512 も SHA-2 の関数です。
MD5 と SHA-1 はどう破られたか
2004年、王小雲(Xiaoyun Wang)らが数時間で見つけた MD5 の衝突を発表しました。その後の研究で、攻撃者が意味のある2つの異なるファイルから始めて、ハッシュが一致するまでデータを付け足す選択プレフィックス衝突が実現しました。2008年には研究者がこれを使って不正な認証局の証明書を作成し、2012年に発見されたマルウェア Flame は MD5 の衝突を使って Microsoft のコード署名証明書を偽造しました。RFC 6151 は、デジタル署名など衝突耐性が必要な場面で MD5 を使ってはならないとしています。
SHA-1 も続きました。2017年、Google とアムステルダムの CWI による SHAttered プロジェクトが、SHA-1 ハッシュが同じ2つの異なる PDF ファイルを公開し、2020年には SHA-1 の選択プレフィックス衝突も実証されました。それ以降、Git、TLS 証明書、コード署名は SHA-256 に移行済みか、移行中です。
MD5 への原像攻撃は、いまも現実的ではありません。ここでいう「破られた」とは、攻撃者が衝突するファイルのペアを作れるという意味で、既存の MD5 を元に戻せるという意味ではありません。
MD5 でも問題ない場面、問題がある場面
| 用途 | MD5 で問題ないか | 理由 |
|---|---|---|
| ダウンロードやコピーでの偶発的な破損の検出 | 問題ない | ランダムなビットエラーでは衝突は起こらない |
| 自分のシステム内での重複排除やキャッシュキー | たいてい問題ない | 攻撃者が入力を操作できない限りは大丈夫 |
| 悪意のあるミラーに対するダウンロードの検証 | 問題がある | 攻撃者は衝突するファイルを用意できる。SHA-256 を使う |
| デジタル署名と証明書 | 問題がある | 衝突攻撃で署名を偽造できる |
| パスワードの保存 | 問題がある | 計算が速すぎる。SHA-256 も同じ |
選べるなら SHA-256 を選びましょう。どこでも使え、最近の CPU ではハードウェアで高速化されており、その用途が衝突に敏感かどうかを議論する必要もなくなります。
パスワードには遅くてソルト付きのハッシュが必要
汎用のハッシュ関数は速く動くように設計されています。最新の GPU 1枚で毎秒数十億回の MD5 や SHA-256 を計算できるため、ソルトなしの SHA-256 パスワードハッシュの表が漏えいすると、巨大な単語リストで攻撃でき、同じパスワードは同じハッシュとして現れます。
パスワードハッシュ関数は、この両方の問題を解決します。ユーザーごとに固有のランダムなソルトを加えて同じパスワードでも異なるハッシュにし、意図的に遅く、新しい設計ではメモリハードにして GPU の利点をほとんどなくします。
- Argon2id:2015年の Password Hashing Competition の優勝方式で、新しいシステムではふつう第一候補です。
- scrypt:メモリハードで、広く利用できます。
- bcrypt:数十年の実績があります。パスワードの先頭 72 バイトしか読まない点に注意してください。
- 反復回数の多い PBKDF2:FIPS 認証済みのアルゴリズムが求められる場面で使えます。
よくある質問
MD5 のハッシュは復号できますか?
できません。ハッシュは暗号化ではなく、元に戻すための鍵もありません。オンラインの「MD5 復号」サービスは、よく使われる文字列のハッシュを事前に計算した表から検索しているだけです。短い入力やありふれた入力がすぐ見つかるのはそのためです。
2026年でも SHA-256 は安全ですか?
はい。SHA-256 に対する現実的な衝突攻撃や原像攻撃は知られておらず、NIST も引き続き承認しています。2^128 という衝突耐性は、現在の計算能力をはるかに超えています。
Web サイトがいまだに MD5 のチェックサムを公開しているのはなぜですか?
よくある問題である、不完全なダウンロードや破損したダウンロードを検出できるからです。改ざんされたファイルへの対策になるのは、チェックサムが信頼できる提供元から来ていて、SHA-256 以上を使っている場合だけです。
SHA-256 はパスワードのハッシュ化に向いていますか?
単体では向きません。高速で、デフォルトではソルトもないため、漏えいしたハッシュは毎秒数十億回の推測で解読されてしまいます。代わりに Argon2id、scrypt、bcrypt を使いましょう。