MD5(Message Digest Algorithm 5)は、かつてパスワードの保存やファイルの整合性確認に広く使われてきたハッシュ関数です。しかし現在では、多くの開発ガイドラインやセキュリティ機関が「MD5を使用すべきでない」と警告しています。
この記事では、MD5の仕組みを図解で確認しながら、なぜ非推奨とされているのか、実際にどのようなセキュリティ事故が起きたのか、そしてSHA-256へどう移行すればよいのかを、実務目線で解説します。
MD5(Message Digest Algorithm 5)とは
MD5は、1991年に暗号学者のRonald Rivest氏(MIT)によって開発されたハッシュ関数です。前身であるMD4の改良版として設計され、RFC 1321として仕様が公開されています。
固定長のハッシュ値を出力する
MD5は、任意の長さの入力に対して、常に128ビット(16バイト)の固定長ハッシュ値を出力します。出力されるハッシュ値は、16進数で32文字の文字列として表記されるのが一般的です。例えば文字列「password」をMD5でハッシュ化すると、5f4dcc3b5aa765d61d8327deb882cf99 という値になります。
同じ入力からは必ず同じ値になる
MD5には一方向性という性質があり、同じ入力データからは必ず同じハッシュ値が生成されます。逆にハッシュ値から元のデータを逆算することは、原理的に困難とされています。
計算処理が高速である
MD5は軽量な環境でも高速に計算できるよう設計されています。この「入力データの正しさを短い文字列で確認できる」という性質から、MD5はファイルの改ざん検知やパスワードの保存など、幅広い用途で使われてきました。ただし、この高速性こそが後述する脆弱性の一因にもなっています。
MD5の仕組み
MD5は、次の4つのステップで入力データをハッシュ値に変換します。
ステップ1:パディング
データの長さを512ビットの倍数(マイナス64ビット)に揃えるため、末尾にビットを追加します。
ステップ2:初期化
A・B・C・Dという4つの32ビットレジスタに初期値を設定します。
ステップ3:ブロック処理
データを512ビットずつのブロックに分割し、各ブロックに対して4ラウンドの演算を繰り返します。
ステップ4:出力
最終的なA・B・C・Dの値を連結し、128ビットのハッシュ値として出力します。
処理の流れを図にすると、以下のようになります。
このように、MD5は「元のデータがどれだけ長くても、決まった手順を経て必ず同じ長さのハッシュ値になる」という仕組みを持っています。この仕組み自体は現在のSHA-2やSHA-3といった新しいハッシュ関数にも共通する基本原理ですが、MD5は内部の演算構造が単純であるがゆえに、後述する脆弱性を抱えることになりました。
MD5が非推奨とされる3つの理由
MD5が「使うべきでない」とされる理由は、大きく3つに整理できます。
① 衝突耐性の欠如(2004年の衝突攻撃実証)
ハッシュ関数には「異なる入力から同じハッシュ値が生成されない」という衝突耐性が求められます。しかし2004年、中国の研究者ワン・シャオユン氏らのチームがMD5の衝突を実用的な計算量で見つけ出す手法を発表しました。
その後、2011年に公表されたIETFのRFC 6151では、当時の一般的なCPU(2.6GHz程度)を用いても約10秒で衝突するデータの組を見つけられることが報告されています。これは「異なる2つのファイルに同一のMD5ハッシュ値を持たせる」ことが現実的に可能であることを意味します。
② 計算速度が速すぎる
MD5は本来「高速に計算できること」を目的の一つとして設計されました。しかしこの特性は、パスワードハッシュのような用途においては裏目に出ます。計算が速いということは、攻撃者が総当たり(ブルートフォース)で大量のハッシュ値を試行する際にも有利に働くためです。
128ビットというハッシュ長も、現在のコンピューティング性能からすると短く、最大でも数日程度で解読される可能性が指摘されています。
③ レインボーテーブル攻撃への弱さ
レインボーテーブルとは、平文とそのハッシュ値の組み合わせを事前に計算し、テーブル化したものです。MD5は非常に広く使われてきた分、既知の文字列に対するハッシュ値がインターネット上に大量に公開されています。ソルト(ランダムな追加データ)を付加せずにMD5でパスワードを保存すると、このレインボーテーブルを使って短時間で元のパスワードを逆引きされるリスクがあります。
MD5の脆弱性が引き起こした実際のセキュリティ事故
MD5の脆弱性は理論上の問題にとどまらず、実際の被害にもつながっています。
Flameマルウェアによる証明書偽造
MD5ハッシュ関数の弱点を悪用し、Microsoft Windows Updateサービスの正規の証明書を偽造する攻撃が確認されました。この手法は世界中の大企業のネットワークに影響を及ぼしました。
Badoo(2013年)の情報漏洩
ソーシャルサービスから約1億1,200万件のメールアドレスと、MD5ハッシュとして保存されたパスワードなどの個人情報が流出しました。
Youku(2016年)の情報漏洩
中国の動画サービスから約9,200万件のユーザーアカウントとMD5パスワードハッシュが流出しました。
いずれのケースも、MD5でハッシュ化されていたパスワードが、レインボーテーブルや衝突攻撃の手法によって解読・悪用されるリスクを抱えていた点が共通しています。パスワードやアクセス制御にMD5を使い続けることは、実際のインシデントに直結しうるという点を認識しておく必要があります。
MD5とSHA-256の違い
MD5に代わって現在広く推奨されているのが、SHA-2ファミリーに属するSHA-256です。両者の違いを図にまとめました。
ハッシュ長の違い
MD5は128ビット(32文字)、SHA-256は256ビット(64文字)のハッシュ値を出力します。ハッシュ長が長いほど、総当たり攻撃に必要な計算量は指数的に増加します。SHA-256は現在のコンピューティング性能をもってしても、現実的な時間で解読することは極めて困難とされています。
衝突耐性の違い
MD5は前述の通り衝突攻撃が実証されていますが、SHA-256は現時点で実用上安全とされています。ただし、SHA-1もMD5と同様に衝突攻撃が実証されており(2017年のGoogleによる「SHAttered」攻撃)、現在ではSHA-1も非推奨とされています。「MD5より新しいから安全」という単純な判断ではなく、現行の推奨アルゴリズムであるSHA-256やSHA-3を選ぶことが重要です。
処理速度と推奨用途の違い
MD5はSHA-256よりも処理速度が速い一方、それが攻撃者にとっての強みにもなってしまいます。SHA-256はMD5よりやや処理は遅いものの、安全性を重視した設計になっており、パスワード・署名・証明書といったセキュリティ用途に適しています。
MD5からSHA-256への移行方法
既存システムでMD5を使用している場合、以下の観点で移行を検討します。
パスワードハッシュの移行
パスワードの保存にMD5を使用している場合、SHA-256への単純な置き換えだけでは不十分です。SHA-256も含め、汎用ハッシュ関数は計算が高速であるため、パスワード用途としてはbcrypt・scrypt・Argon2といった、意図的に計算コストを高くした専用のアルゴリズムへの移行が推奨されます。
段階的移行の進め方
既存ユーザーのパスワードは再ハッシュが必要になるため、次回ログイン時に新しいアルゴリズムでハッシュを再計算する仕組みを用意するのが一般的です。移行期間中は、旧ハッシュ(MD5)と新ハッシュの両方を検証できるようにしておきます。
ソルトの付加
移行にあわせて、ユーザーごとに異なるランダム値であるソルトを必ず付加します。ソルトを付加することで、同じパスワードを使っているユーザー同士でもハッシュ値が異なるようになり、レインボーテーブル攻撃への耐性が高まります。
ファイル整合性チェックの移行
ソフトウェア配布時のチェックサムとしてMD5を使っている場合は、SHA-256への切り替えは比較的シンプルです。多くの言語・OSの標準ライブラリがSHA-256をサポートしているため、ハッシュ計算関数の呼び出しを変更するだけで対応できます。
# Linux/macOSでのハッシュ値計算例
md5sum file.zip # 旧:MD5
sha256sum file.zip # 新:SHA-256
既存システムでの実装変更のポイント
データベース側の対応
データベースに保存されているハッシュ値の桁数(カラムサイズ)を32文字から64文字に拡張する必要があります。
外部連携システムへの影響確認
外部システムやAPI連携でMD5ハッシュ値を用いている場合、連携先との調整も必要になります。移行前後でハッシュ値の互換性はないため、実装変更は計画的なバージョン管理のもとで行うことが重要です。
MD5を使ってもよいケースはあるのか
MD5には脆弱性がある一方で、すべての用途で使用禁止というわけではありません。
非暗号用途であれば利用の余地がある
ファイルの意図しない破損(通信エラーなど)を検出するための簡易チェックサムや、データベース内でのパーティションキーの割り振りなど、セキュリティを目的としない用途であれば、現在でも利用されることがあります。
セキュリティ用途では避けるべき
一方で、パスワードの保存、デジタル署名、証明書、認証トークンの生成など、セキュリティが求められる用途では、MD5の利用は避けるべきです。カーネギーメロン大学のソフトウェアエンジニアリングインスティテュートも、いかなる場合においてもMD5を暗号用途で使用しないよう警告しています。
まとめ
MD5は1991年に開発された歴史あるハッシュ関数であり、その処理速度の速さから長年広く利用されてきました。しかし2004年の衝突攻撃の実証を皮切りに、衝突耐性の欠如、総当たり攻撃への弱さ、レインボーテーブル攻撃への脆弱性が明らかになり、現在ではセキュリティ用途での使用が非推奨とされています。
実際に、MD5の脆弱性を悪用した証明書偽造や大規模なデータ漏洩事故も発生しています。もし自社のシステムでMD5がパスワード保存やデジタル署名に使われている場合は、SHA-256やbcrypt・Argon2といった、より安全なアルゴリズムへの移行を早急に検討することを推奨します。
























![中小企業の情報瀬キィリティ相談窓口[30分無料]](/wp-content/uploads/2023/07/bnr_footer04.png)


