パスワードを平文で保存する事の危険性とハッシュ化とは?

パスワードを平文で保存する危険性
パスワードのハッシュ化とは何か? 超わかりやすく解説

パスワードを平文で保存する危険性

パスワードを平文(そのまま読み取れる文字列、プレーンテキスト)でデータベースに保存する場合、データベースが侵害された際に攻撃者がパスワードを直接読み取ることが可能になります。これにより、ユーザーのアカウントが即座に悪用される危険性が生じます。実際、多くの過去のセキュリティ侵害事例では、平文保存が原因で大量のパスワードが漏洩し、ユーザーのプライバシーが深刻に損なわれました。

データベース侵害の影響

データベースがハッキングされた場合、平文のパスワードは暗号化されていないため、攻撃者は追加の処理なしで使用できます。これにより、同一パスワードを使い回すユーザーの他のサービスへの二次被害が発生しやすくなります。

コンプライアンスと法的側面

平文保存は、GDPRやHIPAAなどのデータ保護規制に違反する可能性があり、企業に罰金や信頼喪失を招きます。これらの規制は、個人情報の適切な保護を義務づけています。

ハッシュ化の仕組みと利点

ハッシュ化とは、一方向性の関数を使用してパスワードを固定長の文字列(ハッシュ値)に変換する手法です。この変換は逆行不可能であるため、元のパスワードを復元できません。認証時には、入力されたパスワードを同じ関数でハッシュ化し、保存されたハッシュ値と比較します。

一方向性の重要性

ハッシュ関数(例: SHA-256やbcrypt)は、計算が高速で逆計算が極めて困難であるため、漏洩したハッシュ値からパスワードを推測するのは現実的に不可能です。これにより、データ侵害時の被害を最小限に抑えられます。

レインボーテーブル攻撃への耐性

単純なハッシュ化だけでは、事前計算されたハッシュ値のテーブル(レインボーテーブル)を使った攻撃に脆弱です。しかし、ハッシュ化自体が基本的な保護を提供し、攻撃の難易度を高めます。

ソルトの役割と追加のセキュリティ

ソルトとは、各パスワードにユニークなランダム文字列を追加してからハッシュ化する手法です。これにより、同じパスワードでも異なるハッシュ値が生成され、レインボーテーブル攻撃を無効化します。ソルトは通常、ハッシュ値と共に保存されますが、秘密に保つ必要はありません。

同一パスワードの多様化

複数のユーザーが同じパスワードを使用した場合、ソルトなしでは同一のハッシュ値が生じ、攻撃者が一括で推測しやすくなります。ソルトにより、各ハッシュがユニークになるため、個別の計算を強制します。

ブルートフォース攻撃への対策

ソルト付きハッシュ化は、攻撃者が総当たり攻撃(ブルートフォース)を行う際の計算コストを増大させます。特に、bcryptやArgon2のような遅延ハッシュ関数を組み合わせることで、攻撃の実行時間を延ばせます。

実装のベストプラクティス

パスワード保存には、業界標準のハッシュ関数(bcrypt, PBKDF2, Argon2)とソルトを組み合わせることを推奨します。これにより、セキュリティの専門家が推奨する基準を満たし、将来の脅威にも対応可能です。

定期的な更新と監視

ハッシュアルゴリズムは進化する脅威に対応するため、定期的に強化すべきです。また、侵害の兆候を監視し、必要に応じてパスワードリセットを促す仕組みを導入します。

パスワードのハッシュ化とは何か? 超わかりやすく解説

パスワードを「ハッシュ化する」とは、元のパスワードを完全に別の意味のない文字列(ハッシュ値)に変換して保存する技術です。
この変換は「一方通行」なので、変換後の文字列を見ても、元のパスワードに戻すことはほぼ不可能です。

例えでイメージするハッシュ化

好きな料理をミキサーにかけて完全にペーストにしたと想像してください。
ペーストを見ても「これはハンバーグだった」「これはカレーだった」と正確に特定するのは極めて難しいですよね。
ハッシュ化は、まさにパスワードを「情報ペースト」にする作業です。

実際にどうやって認証するの?

  1. ユーザーが初めて登録するとき
    入力されたパスワード(例: MyPass123!)→ ハッシュ関数 → abc123xyz999…(64文字くらいの意味不明な文字列)
  2. この意味不明な文字列だけをデータベースに保存
  3. 次にログインするとき
    ユーザーがまた MyPass123! と入力 → 同じハッシュ関数 → abc123xyz999…
    データベースに保存されている abc123xyz999… と完全に一致するかチェック → 一致したら「正しいパスワード!」

サーバー側は一度も「MyPass123!」という平文を見ていないのに、正しく認証できるのです。

なぜ「逆算できない」のが重要なのか

世の中にはMD5やSHA-1といった古いハッシュ関数がありますが、今は「簡単に逆算できる」ことがわかっています。
だから現代では、以下のような「意図的に遅くて逆算が極めて難しい」ハッシュ関数だけを使います。

現在推奨されている安全なハッシュ関数(2025年時点)

  • bcrypt – 最も広く使われている。コストパラメータで計算時間を調整可能
  • Argon2 – 2015年のPassword Hashing Competitionで優勝。メモリも多く使うのでさらに強固
  • PBKDF2 – 古いが正しく設定すれば今でも安全
  • scrypt – メモリを大量に使うことでGPU攻撃を困難に

具体的な強さのイメージ

ハッシュ関数 1つのパスワードをハッシュ化するのにかかる時間(目安) 10億個試すのにかかる時間
MD5(古くて危険) 0.000001秒 数時間~数日
bcrypt(コスト12) 約0.2秒 約60万年
Argon2id(適切な設定) 約0.5秒 数百万年以上

この「1回あたり0.2~0.5秒かかる」という遅さが、攻撃者を絶望させる最大の武器です。

まとめ:ハッシュ化の本質

  • パスワードは「元に戻せない形」に変換して保存する
  • 認証は「同じ変換をもう一度やって一致するか?」だけで行う
  • 現代のハッシュ関数は「意図的に遅く」作られている
  • これにより、データベースが丸ごと漏洩しても、ユーザーのパスワードはほぼ安全に守られる

これが「パスワードは平文ではなくハッシュで保存すべき」と言われる、もっとも根本的な理由です。