パスワードハッシュ化 ぱすわーどはっしゅか
簡単に言うとこんな感じ!
パスワードを「元に戻せない暗号」に変換して保存する技術だよ!たとえば「password123」が「$2b$12$xyz…」みたいな謎の文字列になるんだ。万が一データが漏れても、元のパスワードが分からないから安心ってこと!
パスワードハッシュ化とは
パスワードハッシュ化とは、ユーザーのパスワードをハッシュ関数と呼ばれる特殊な計算式に通して、元に戻せない固定長の文字列(ハッシュ値)に変換してからデータベースに保存する技術です。「平文(ひらぶん)のまま保存しない」ための、パスワード管理の基本中の基本です。
なぜ必要かというと、システムがサイバー攻撃を受けてデータベースが丸ごと盗まれることがあるからです。そのとき、パスワードが平文(そのままの文字)で保存されていたら一発アウトですが、ハッシュ化されていれば攻撃者はすぐには使えません。2012年のLinkedIn流出事件では約650万件のハッシュが盗まれましたが、当時使われていた古いアルゴリズム(SHA-1)のせいで多くが解読されてしまいました。
現代のシステムでは、ハッシュ化に加えてソルト(後述)を組み合わせ、bcryptやArgon2などの専用アルゴリズムを使うことが業界標準となっています。「うちはクラウドサービスに丸投げだから関係ない」と思いがちですが、自社でユーザー管理をしているなら必ず確認すべき項目です。
ハッシュ化の仕組みと構成要素
ハッシュ化の基本フロー
ユーザー入力 ハッシュ化処理 DBに保存
┌──────────┐ ┌──────────────────┐ ┌──────────────────────────┐
│password123│──────▶│ ソルト付与 │──────▶│$2b$12$aBcDeFgH...xYzAbC │
└──────────┘ │ + bcrypt演算 │ └──────────────────────────┘
└──────────────────┘
↑
元には戻せない(不可逆)
ログイン時の照合フロー
ユーザー入力 同じ処理を適用 DB保存値と比較
┌──────────┐ ┌────────────┐ ┌──────┐
│password123│──────▶│ハッシュ化 │──────▶│ 一致?│──▶ 認証OK / NG
└──────────┘ └────────────┘ └──────┘
※パスワード自体は照合に使わない。ハッシュ値同士を比べるだけ
主要な構成要素
| 用語 | 意味 | たとえ話 |
|---|---|---|
| ハッシュ値 | パスワードを変換した固定長の文字列 | 肉を挽き肉にしたもの(元には戻せない) |
| ソルト | ハッシュ化前にパスワードへ付け足すランダム文字列 | 料理の隠し味。同じ素材でも味が変わる |
| ストレッチング | ハッシュ計算を何千〜何万回も繰り返すこと | 鍵穴を意図的に複雑にして時間を稼ぐ |
| コストパラメータ | ストレッチング回数を調整する設定値 | 数字を上げるほど解読に時間がかかる |
なぜ「ソルト」が必要なのか
ソルトがないとレインボーテーブル攻撃(よくあるパスワードのハッシュ値を事前に大量計算した辞書を使う攻撃)に弱くなります。ソルトを付けることで、同じ「password123」でも人によって別のハッシュ値になり、辞書攻撃を無効化できます。
ソルトなし: password123 → a1b2c3d4(全員同じ → 辞書で一発)
ソルトあり: password123 + xK9mQ2 → $2b$12$xK9mQ2...(人によって違う)
password123 + zR7nP5 → $2b$12$zR7nP5...(全然違う文字列に)
覚え方:「ひき肉理論」
ハッシュ化 = 肉をひき肉にすること。一方通行で、絶対に元の肉には戻せない。そこにソルト(塩)を振れば、同じ肉でも全く別の料理になる。
歴史と背景
- 1970年代 — UNIXシステムが
crypt()関数でパスワードをハッシュ化して保存する仕組みを導入。この発想が現代の基礎に - 1990年代 — MD5・SHA-1が広く使われるように。しかしこれらは「速すぎる」ため、GPUで高速に総当たり攻撃できることが後に判明
- 1999年 — bcryptが登場。意図的に計算を重くする「ストレッチング」と、コストパラメータによる強度調整を実現
- 2000年代後半〜 — 大規模な情報漏洩が相次ぎ、平文保存・MD5保存の危険性が広く認知されるように
- 2012年 — RockYou、LinkedIn等の大規模流出事件が続き、業界全体でパスワード管理の見直しが加速
- 2015年 — Argon2がPassword Hashing Competition(PHC)で優勝。メモリを大量消費する設計でGPU攻撃に強い
- 現在 — bcrypt / Argon2 / scrypt が推奨アルゴリズムの三本柱。NISTもこれらの利用を推奨
アルゴリズムの比較と選び方
主要ハッシュアルゴリズムの比較
| アルゴリズム | 速度 | GPU耐性 | メモリ耐性 | 現在の推奨度 |
|---|---|---|---|---|
| MD5 | 非常に速い | ✗ 弱い | ✗ 弱い | ❌ 使用禁止 |
| SHA-256 | 速い | ✗ 弱い | ✗ 弱い | ❌ パスワードには不適切 |
| bcrypt | 遅い(意図的) | △ 中程度 | ✗ 弱い | ✅ 推奨(実績あり) |
| scrypt | 遅い | ✅ 強い | ✅ 強い | ✅ 推奨 |
| Argon2id | 遅い | ✅ 強い | ✅ 最強 | ✅ 最推奨(NIST) |
💡 発注・選定のポイント: ベンダーに「パスワードはどのアルゴリズムでハッシュ化していますか?」と聞いてみましょう。「MD5です」「SHA-1です」という回答が返ってきたら要注意です。
ハッシュ化 vs 暗号化の違い(よく混同される!)
⚠️ よくある誤解: 「パスワードを暗号化して保存しています」という説明は、実は問題をはらんでいます。暗号化は「鍵さえあれば元に戻せる」ため、鍵が漏れると全パスワードが露出します。パスワードには必ず不可逆なハッシュ化を使うべきです。
関連する規格・RFC
| 規格・RFC番号 | 内容 |
|---|---|
| NIST SP 800-63B | 米国標準技術研究所によるデジタル認証ガイドライン。Argon2・bcrypt・scryptの使用を推奨 |
| RFC 9106 | Argon2アルゴリズムの仕様を定めた正式RFC(2021年) |
| OWASP Password Storage Cheat Sheet | 開発者向けのパスワード保存ベストプラクティス集 |
| PCI DSS v4.0 | クレジットカード業界のセキュリティ基準。パスワード管理要件を含む |