パスワードハッシュ化標準:MD5やSHA-256では不十分な理由
開発者にとって、ユーザーのパスワードを保護することは最も神聖な責任の一つです。パスワードを平文で保存することが論外なのは言うまでもありませんが、多くの開発者が依然として「高速な」暗号学的ハッシュ(MD5やSHA-256など)をパスワード保存に使用するという過ちを犯しています。
本ガイドでは、なぜそれらの手法が不適切なのか、そして安全なパスワード保存のための現在の業界標準は何なのかを解説します。
1. 「高速な」ハッシュの問題点
MD5, SHA-1, SHA-256 といったアルゴリズムは、高速に動作するように設計されています。これらは、巨大なファイルの整合性を数ミリ秒で検証するためのものです。
ファイルチェックには適した「速さ」ですが、パスワード保存においては悪夢となります。現代のGPUは、1秒間に数十億回のSHA-256ハッシュ計算が可能です。もし攻撃者があなたのデータベースからSHA-256でハッシュ化されたパスワードを盗み出した場合、単純なパスワードであれば、総当たり(ブルートフォース)攻撃によってわずか数時間ですべて特定されてしまいます。
2. 現代的な「低速な」ハッシュアルゴリズム
総当たり攻撃を防ぐには、意図的に計算コストが高くなるように設計されたアルゴリズムを使用します。これらは「適応型」ハッシュと呼ばれ、ハードウェアの進化に合わせて「ワークファクター(計算負荷)」を調整できます。
Argon2:現在のゴールドスタンダード
Argon2は2015年のパスワードハッシュ競技会(Password Hashing Competition)で優勝し、現在OWASPやNISTによって推奨されている標準です。
- Argon2id: 推奨されるバリアントです。GPUによる解析と、サイドチャネル攻撃の両方に対して耐性があります。
- カスタマイズ可能: メモリ使用量、反復回数、並列度を調整でき、サーバー上で1つのパスワードをハッシュ化するのに500msかかるように設定することが可能です。
bcrypt:信頼と実績のクラシック
1999年に開発されたbcryptは、歴史の中で最も広く使われ、信頼されているアルゴリズムの一つです。
- コスト因子: 「cost」パラメータを使用します。この値を1増やすごとに、ハッシュ計算にかかる時間が2倍になります。
- 現在も有効: 登場から時間は経っていますが、現代の攻撃に対しても依然として非常に高い安全性を保っています。
scrypt:メモリハードの先駆者
scryptは、「メモリハード性」を導入した最初の主要なアルゴリズムです。計算に多大なRAMを必要とするため、攻撃者が専用の解析ハードウェア(ASIC)を構築して解読するコストを極めて高くします。
3. アルゴリズムを超えて:ソルトとペッパー
強力なアルゴリズムを使っていても、さらに保護層を追加する必要があります。
ソルト (Salt):レインボーテーブルの無効化
ソルトは、ハッシュ化する前にパスワードに追加されるランダムな文字列です。
- 理由: ソルトがない場合、2人のユーザーが同じパスワード(例:「password123」)を使っていると、ハッシュ値も同じになります。攻撃者は「レインボーテーブル(計算済みハッシュリスト)」を使って、瞬時にこれらを解読できます。
- 鉄則: ユーザーごとに、アカウント作成時に生成された固有のランダムなソルトを割り当てる必要があります。
ペッパー (Pepper):秘密のスパイス
ペッパーはソルトに似ていますが、データベースには保存せず、安全な設定ファイルやハードウェアセキュリティモジュール(HSM)に保存されます。
- 理由: 万が一データベースが盗まれても、アプリケーション側の秘密鍵(ペッパー)が盗まれていなければ、攻撃者はハッシュを解読できません。
4. 開発者のためのベストプラクティス
- MD5やSHA-1は絶対に使わない: セキュリティ用途としては完全に壊れています。
- 生のSHA-256を避ける: 速すぎて、GPUで簡単に解読されてしまいます。
- Argon2idまたはbcryptを選択する: 新規プロジェクトならArgon2id、ライブラリのサポートが充実しているbcryptも良い選択肢です。
- ワークファクターを調整する: ハッシュ計算時間が250ms〜500msになるように調整します。人間がログインを待てる範囲でありながら、攻撃者を阻止するのに十分な遅さです。
- 常にソルトを付与する: 現代の多くのライブラリ(Node.jsの
bcryptなど)は、ソルトの生成と管理を自動で行ってくれます。
アルゴリズム比較まとめ
| アルゴリズム | タイプ | メモリハード | 推奨度 |
|---|---|---|---|
| MD5 | 高速ハッシュ | なし | ❌ 絶対NG |
| SHA-256 | 高速ハッシュ | なし | ❌ 不適切(パスワード用として) |
| PBKDF2 | 低速ハッシュ | なし | ⚠️ レガシー向け |
| bcrypt | 低速ハッシュ | なし | ✅ 推奨 |
| scrypt | 低速ハッシュ | あり | ✅ 推奨 |
| Argon2id | 低速ハッシュ | あり | 🏆 最良 |
結論
パスワードの保護は、単にランダムなアルゴリズムを選ぶことではなく、現代のハードウェアのパワーに耐えうるツールを使うことです。適切なソルトとワークファクターを備えた Argon2id を使用することで、ユーザーに現在利用可能な最高レベルのセキュリティを提供できます。
ハッシュのテストや、自分用のアカウントに安全なパスワードを生成したいですか?当サイトの パスワード生成ツール や ハッシュ生成ツール を使って、データを安全に保ちましょう。