跳转到主要内容

密码哈希

本文约需 2 分钟阅读

パスワードハッシュ化とは、ユーザーのパスワードを不可逆な固定長の値に変換してから データベースに保存する技術です。万が一データベースが漏洩しても、ハッシュ値から 元のパスワードを復元できないため、被害を最小限に抑えられます。 パスワードの平文保存は、現代のセキュリティ基準では許容されない重大な設計ミスです。

平文保存の危険性

パスワードを平文 (そのままの文字列) で保存することの危険性は、 過去の大規模インシデントが証明しています。 2009 年の RockYou 事件では、 約 3,200 万件のパスワードが平文のまま漏洩しました。攻撃者はデータベースを 取得した瞬間に全ユーザーのパスワードを手に入れ、パスワードを使い回していた ユーザーは他のサービスでも被害を受けました。この事件は、パスワードの 平文保存がいかに壊滅的な結果を招くかを世界に示した象徴的な事例です。 情報漏洩時の対応については情報漏洩時の対応ガイドで 詳しく解説しています。

パスワードハッシュ化の全体像

パスワード入力
ソルト付加
ストレッチング (数千〜数万回反復)
ハッシュ値を DB に保存

汎用ハッシュがパスワードに不適切な理由

SHA-256 や SHA-512 は暗号学的に安全なハッシュ関数ですが、 パスワードのハッシュ化には適していません。理由は「速すぎる」からです。 SHA-256 は 1 秒間に数十億回のハッシュ計算が可能であり、 GPU を使えばさらに高速化できます。攻撃者にとっては、短時間で膨大な数の パスワード候補を試行できることを意味します。パスワード専用のハッシュ関数は 意図的に計算を遅くすることで、この問題に対処しています。

ソルトとペッパーの役割

ソルト

ユーザーごとに異なるランダムな値をパスワードに付加してからハッシュ化します。 同じパスワードでもソルトが異なればハッシュ値が変わるため、レインボーテーブル攻撃を 無効化できます。ソルトはハッシュ値と一緒にデータベースに保存します。

ペッパー

全ユーザー共通の秘密値で、データベースとは別の場所 (環境変数や HSM) に 保管します。データベースが漏洩してもペッパーがなければハッシュの 再計算ができないため、追加の防御層として機能します。 ただし鍵管理の複雑さが増すため、導入は慎重に判断します。

ストレッチングの概念

ストレッチングとは、ハッシュ計算を意図的に何千回、何万回と繰り返すことで、 1 回のハッシュ計算にかかる時間を引き延ばす手法です。正規ユーザーのログインでは 1 回の計算で済むため数百ミリ秒の遅延は許容範囲ですが、攻撃者が数億個の パスワード候補を試す場合、 1 回あたりの遅延が累積して攻撃を非現実的にします。Argon2bcrypt は ストレッチングの仕組みを内蔵しています。

現代の推奨アルゴリズム

OWASP の 2025 年時点の推奨順位は以下のとおりです。

1. Argon2id
2. bcrypt
3. scrypt
4. PBKDF2

新規システムでは Argon2id を選択してください。既存システムで bcrypt を 使用している場合、コストファクターが 12 以上であれば急いで移行する必要はありません。 MD5 、 SHA-1 、 SHA-256 を単体でパスワードハッシュに使用している場合は、 速やかに上記のいずれかへ移行すべきです。クレデンシャル漏洩の リスクを最小化するためにも、適切なアルゴリズム選択は不可欠です。 暗号化の基礎知識は暗号化の基礎の 記事で学べます。暗号技術とパスワード保護の書籍 (Amazon)も実装の参考になります。

よくある誤解

「暗号化すれば安全」という誤解がよくあります。暗号化は 鍵があれば復号できる双方向の変換であり、鍵が漏洩すれば全パスワードが 一度に露出します。パスワードの保存にはハッシュ化 (一方向変換) が正解です。 また、「ソルトを秘密にすればペッパーは不要」という考えも誤りです。 ソルトはハッシュ値と一緒に保存するため、データベース漏洩時には同時に露出します。 ペッパーはデータベースとは別の場所に保管するからこそ追加の防御層になります。 安全なパスワード運用の全体像は安全なパスワード管理ガイドを 参照してください。

相关术语

这篇文章对您有帮助吗?

XHatena