認証

パスワードハッシュ化 ぱすわーどはっしゅか

ハッシュ関数bcryptソルト不可逆変換パスワード管理情報漏洩対策
パスワードハッシュ化について教えて

簡単に言うとこんな感じ!

パスワードを「元に戻せない暗号」に変換して保存する技術だよ!たとえば「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 暗号化の違い(よく混同される!)

ハッシュ化(不可逆) 平文パスワード ↓ ハッシュ関数 $2b$12$aBcDe... (ハッシュ値) ❌ 元には戻せない ✅ パスワード保存に使う 暗号化(可逆) 平文データ ↓ 暗号鍵で変換 X9kR2mP... (暗号文) ✅ 鍵があれば元に戻せる ✅ ファイル暗号化などに使う

⚠️ よくある誤解: 「パスワードを暗号化して保存しています」という説明は、実は問題をはらんでいます。暗号化は「鍵さえあれば元に戻せる」ため、鍵が漏れると全パスワードが露出します。パスワードには必ず不可逆なハッシュ化を使うべきです。


関連する規格・RFC

規格・RFC番号内容
NIST SP 800-63B米国標準技術研究所によるデジタル認証ガイドライン。Argon2・bcrypt・scryptの使用を推奨
RFC 9106Argon2アルゴリズムの仕様を定めた正式RFC(2021年)
OWASP Password Storage Cheat Sheet開発者向けのパスワード保存ベストプラクティス集
PCI DSS v4.0クレジットカード業界のセキュリティ基準。パスワード管理要件を含む

関連用語

  • ハッシュ関数 — 任意の長さのデータを固定長の値に変換する一方向性の関数
  • ソルト — ハッシュ化前にパスワードへ付加するランダムな文字列。レインボーテーブル攻撃を防ぐ
  • 多要素認証 — パスワード以外の認証要素を追加してセキュリティを強化する仕組み
  • 情報漏洩 — 機密データが外部に流出するインシデント。ハッシュ化が特に重要になる場面
  • bcrypt — 現在最も広く使われるパスワードハッシュアルゴリズムの一つ
  • レインボーテーブル攻撃 — 事前計算されたハッシュ値の辞書を使