状況
会員登録でパスワードを保存するコードのレビュー。
このパスワード保存の直し方として正しいものは?
import hashlibdef save_password(user, password): user.password_hash = hashlib.sha256(password.encode()).hexdigest()正答
- Argon2 や bcrypt など、パスワード専用のハッシュ関数で保存する
- SHA-256 を SHA-512 に変えて、ハッシュの値をもっと長くする
- ハッシュではなく AES で暗号化し、鍵はアプリの設定ファイルに置く
- SHA-256 を 2 回かけて、元のパスワードを戻せないようにする
解説
SHA-256 はデータの改ざん検知などのために速く計算できるよう作られた関数で、GPU を使えば 1 秒に膨大な数の候補を試せる。ソルトも無いので、同じパスワードの会員は同じ値になり、よくあるパスワードの一覧からまとめて割り出される。Argon2・bcrypt・scrypt のようなパスワード専用の関数は、会員ごとのソルトを自動で付け、わざと計算を遅くして総当たりを難しくする。SHA-512 にしたり 2 回かけたりしても、速いことは変わらない。暗号化は鍵があれば元に戻せ、鍵と一緒に漏れれば全員の平文が分かる。
参考: cheatsheetseries.owasp.org
この問題を含む セキュリティ のテストを制限時間つきで解く
セキュリティクイズへ