なぜMD5/SHA1はNG?エンジニアが選ぶべき安全なパスワードハッシュ化最前線
Webアプリケーションやシステムの開発に携わる皆さん、ユーザーのパスワードをどのように扱っていますか?「パスワードはハッシュ化して保存する」という基本はご存知かと思いますが、そのハッシュ化の手法が非常に重要です。特にMD5やSHA1といった一昔前のアルゴリズムをまだ使っている場合、それは重大なセキュリティリスクを抱えていることになります。この記事では、なぜMD5/SHA1が「NG」なのか、そして2026年の今、エンジニアが選ぶべき安全なパスワードハッシュ化の最前線について、簡潔に解説します。
MD5/SHA1が安全でない理由
かつては広く利用されていたMD5やSHA1ですが、現代のセキュリティ基準では「完全に不適切」とされています。その主な理由は以下の3点です。
1. 脆弱なハッシュ衝突耐性
ハッシュ衝突とは、異なる入力データから全く同じハッシュ値が生成されてしまう現象を指します。MD5やSHA1は、意図的に衝突を生成する「衝突攻撃」に対して脆弱であることが判明しています。例えば、MD5は2004年には衝突を生成する方法が公表され、SHA1も2017年に現実的な衝突攻撃が可能であることが示されました。パスワードの文脈でハッシュ衝突が起きると、攻撃者が特定のパスワードと同じハッシュ値を持つ別の文字列を生成し、正規のユーザーとして認証を突破できてしまう可能性があります。
2. レインボーテーブル攻撃への脆弱性
レインボーテーブルとは、あらかじめ計算された膨大なハッシュ値と元のパスワードのペアを記録したデータベースのことです。パスワードが漏洩した際、攻撃者はこのテーブルを使ってハッシュ値から元のパスワードを高速に割り出すことができます。MD5やSHA1は計算速度が速いため、レインボーテーブルの作成が容易であり、特にソルト(後述)を使用していない場合は、この攻撃に対して非常に脆弱です。
3. 高速な計算速度によるブルートフォース攻撃の容易さ
MD5やSHA1は、その設計上、非常に高速にハッシュ値を計算できます。これは、現代の高性能なGPUなどを利用したブルートフォース攻撃(総当たり攻撃)に対して非常に不利です。攻撃者は、漏洩したハッシュ値に対して膨大な数のパスワード候補を高速に試行し、短時間で元のパスワードを特定できてしまいます。パスワードのセキュアなハッシュ化においては、「いかに計算を遅くするか」が重要な防御策となります。
2026年、エンジニアが選ぶべき安全なハッシュ化アルゴリズム
MD5やSHA1が使えないとなると、どのような方法でパスワードをハッシュ化すれば良いのでしょうか。ここでは、現代のセキュリティ要件を満たすための重要な概念と、具体的なアルゴリズムを紹介します。
1. 「ソルト」と「ストレッチング」の必須性
安全なパスワードハッシュ化には、単に強力なアルゴリズムを使うだけでなく、「ソルト」と「ストレッチング(鍵導出関数)」という二つの概念が不可欠です。
- ソルト (Salt): 各ユーザーのパスワードに対して、固有のランダムな文字列(ソルト)を付加してからハッシュ化する手法です。これにより、同じパスワードでもユーザーごとに異なるハッシュ値が生成されるため、レインボーテーブル攻撃や、複数のユーザーが同じパスワードを使っていた場合の「一網打尽」攻撃を防ぐことができます。ソルトはパスワードハッシュ値と共にデータベースに保存しても問題ありません。
- ストレッチング (Key Stretching): ハッシュ計算を意図的に遅延させる(計算コストを高くする)手法です。これにより、攻撃者がブルートフォース攻撃を試みた際の計算時間が大幅に増加し、攻撃のコストを非常に高くすることができます。現代のパスワードハッシュ化アルゴリズムは、このストレッチング機能が組み込まれています。
2. 推奨される現代のハッシュ化アルゴリズム
2026年現在、以下のアルゴリズムがパスワードハッシュ化のデファクトスタンダードとして推奨されています。これらはソルトとストレッチングの機能を内包しており、適切なパラメータ設定を行うことで高いセキュリティを維持できます。
- bcrypt: 古くから実績があり、多くのプログラミング言語でライブラリが提供されています。計算コストを調整できる「ワークファクター」という概念を持ち、CPUに特化した処理でブルートフォース攻撃を困難にします。
- scrypt: bcryptに加え、CPUだけでなくメモリ使用量も増大させることで、GPUやカスタムハードウェアによる攻撃(ASICなど)にも耐性を持たせたアルゴリズムです。
- Argon2: 2015年に開催された「Password Hashing Competition」で最優秀賞を受賞した、最も新しい推奨アルゴリズムです。CPUコスト、メモリコスト、並列度を細かく設定でき、ブルートフォース攻撃、レインボーテーブル攻撃、サイドチャネル攻撃など、現代の多様な攻撃に対して高い耐性を持つように設計されています。セキュリティの最前線を追求するなら、Argon2の採用を検討すべきでしょう。
重要: これらのアルゴリズムは、必ず公式ライブラリや信頼できるサードパーティライブラリを通じて利用してください。自分でハッシュ化ロジックを実装することは、潜在的な脆弱性を生み出すリスクが高く、絶対に避けるべきです。
まとめ
ユーザーのパスワード保護は、アプリケーション開発における最も重要なセキュリティ要件の一つです。MD5やSHA1といった旧式のハッシュアルゴリズムは、もはや安全とは言えません。2026年の今、エンジニアとしてセキュリティ意識を高め、ソルトとストレッチング機能を備えたbcrypt、scrypt、そして最先端のArgon2といった現代的なアルゴリズムを積極的に採用していきましょう。これにより、ユーザーの信頼を守り、より安全なシステムを構築することができます。
参考文献
- Xiaoyun Wang, Dengguo Feng, Xuejia Lai, Hongbo Yu. (2004). Collision Search Attacks on MD5.
- Marc Stevens, Elie Bursztein, Pierre Karpman, Ange Albertini, Yarik Markoff. (2017). The first SHA-1 collision.
エンジニアのスキルシェアプラットフォーム「DokuPro」
教えたい人と学びたい人を繋ぐDokuProでは、新規登録(先生・生徒)を募集中です。
詳細はこちら: https://dokupro.dev/