パスワードハッシュ化とは何か?認証情報を安全に保存する
パスワードハッシュ化はパスワードの一方向変換を保存するため、たとえデータベースが盗まれても元のパスワードは明かされません。
パスワードハッシュ化は、責任あるシステムが認証情報を保存する方法です。パスワードを保持する代わりに、ハッシュ、つまりパスワードを復元するために逆算できない一方向関数の出力を保持します。ユーザーがログインする際は、その入力をハッシュ化して比較します。saltingと低速なアルゴリズムを用いて正しく行えば、盗まれたデータベースの被害ははるかに小さくなります。
なぜパスワードを直接保存しないのか
平文のパスワードを保存すると、たった1回のデータベース侵害ですべての認証情報が露出し、しかも人々はサイト間でパスワードを使い回します。ハッシュ化により保存された値をパスワードに戻せなくなるため、侵害が起きても攻撃者に使えるログインを即座に渡すことにはなりません。
ハッシュ化は一方向
- ハッシュ関数は入力を固定サイズの出力に対応づけます。
- 出力を入力に逆算することはできません。
- 候補をハッシュ化して出力を比較することで検証します。
saltと低速性
安全な方式はパスワードごとに一意のsaltを追加し(事前計算されたテーブルを打ち破り)、意図的に低速な関数を使用します。ここでの低速性は利点です。1回の正規のログインに目立った影響を与えることなく、大量の推測を高コストにします。
適切なアルゴリズム
SHA-256のような汎用ハッシュはパスワードには高速すぎます。専用に設計されたパスワードハッシュであるbcrypt、scrypt、Argon2は意図的に低速で調整可能です。パスワードに高速なハッシュを使うのは、典型的で危険な誤りです。
パスワードハッシュ化とCI/CD
あなたのアプリケーションがパスワードを扱うなら、そのコードは高リスクであり、pipelineでの重点的なセキュリティレビューに値します。CIでの静的解析と依存関係スキャンは、脆弱なハッシュ化ライブラリや設定ミスが本番に到達する前に検出できます。
テストデータを清潔に保つ
pipelineは実際の認証情報をseedしたり、パスワードの素材をcommitしたりすべきではありません。テスト用のfixtureは使い捨ての値を使う必要があり、CIでのsecretスキャンはリポジトリに紛れ込んだパスワードやキーを検出するのに役立ちます。
重要なポイント
- パスワードハッシュ化はパスワードそのものではなく、不可逆な変換を保存します。
- 安全なハッシュ化は一意のsaltと意図的に低速なアルゴリズムを使用します。
- bcrypt、scrypt、またはArgon2を使い、パスワードにSHA-256のような高速なハッシュを決して使わないでください。