パスワードをハッシュする理由
パスワードを保存前にハッシュする必要がある理由、パスワードハッシュが汎用ハッシュと異なる点、bcryptやArgon2が専用に存在する理由を解説します。
詳細な説明
パスワードハッシュとは、ユーザーのパスワードそのものではなく一方向ハッシュを保存する手法です。ログイン時、システムは送信されたパスワードをハッシュ化し、保存されたハッシュと比較します。これにより、データベースが侵害されても実際のパスワードは直接露出しません。
なぜ平文で保存してはいけないのか:
データベース侵害は頻繁に発生します。パスワードが平文で保存されていれば、全ユーザーのパスワードが即座に漏洩します。ユーザーはサービス間でパスワードを使い回すことが多いため、一つのサイトの侵害が他のアカウントにも連鎖する可能性があります。
なぜSHA-256をパスワードに使わないのか:
SHA-256のような汎用ハッシュ関数は高速に設計されています。最新のGPUは1秒間に数十億のSHA-256ハッシュを計算できます。SHA-256パスワードハッシュのデータベースを盗んだ攻撃者は、一般的なパスワード、辞書の単語、パターンを数分で試行できます。そのため専用のパスワードハッシュ関数が存在します。それらは意図的に低速かつメモリ集約的です。
専用パスワードハッシュアルゴリズム:
bcrypt(1999年)は設定可能なワークファクターを組み込み、各ハッシュ計算を意図的に遅くします。ワークファクター12では1回のbcryptハッシュに約250msかかります。scrypt(2009年)はメモリ困難性を追加し、GPUやASIC攻撃に対する耐性を高めます。Argon2(2015年)はPassword Hashing Competitionの優勝者で、時間コスト、メモリコスト、並列性を調整可能です。3つともソルトを自動的に組み込みます。
ベストプラクティス:
新しいシステムにはArgon2id(OWASP推奨)を使用してください。Argon2が利用できない場合はbcryptを使用してください。MD5、SHA-1、SHA-256単体をパスワードハッシュに使用しないでください。パスワードごとに固有のランダムソルトを使用してください(bcryptとArgon2は自動処理)。ハードウェアでハッシュに少なくとも250msかかるようにワークファクターを設定してください。
ユースケース
ユーザー認証情報を保存するすべてのWebアプリケーションは、データベース侵害時にユーザーを保護するためにbcryptまたはArgon2でパスワードをハッシュする必要があります。