セキュリティ4 択難易度 標準

状況

会員登録でパスワードを保存するコードのレビュー。

このパスワード保存の直し方として正しいものは?

import hashlibdef save_password(user, password):    user.password_hash = hashlib.sha256(password.encode()).hexdigest()

正答

  1. Argon2 や bcrypt など、パスワード専用のハッシュ関数で保存する
  2. SHA-256 を SHA-512 に変えて、ハッシュの値をもっと長くする
  3. ハッシュではなく AES で暗号化し、鍵はアプリの設定ファイルに置く
  4. SHA-256 を 2 回かけて、元のパスワードを戻せないようにする

解説

SHA-256 はデータの改ざん検知などのために速く計算できるよう作られた関数で、GPU を使えば 1 秒に膨大な数の候補を試せる。ソルトも無いので、同じパスワードの会員は同じ値になり、よくあるパスワードの一覧からまとめて割り出される。Argon2・bcrypt・scrypt のようなパスワード専用の関数は、会員ごとのソルトを自動で付け、わざと計算を遅くして総当たりを難しくする。SHA-512 にしたり 2 回かけたりしても、速いことは変わらない。暗号化は鍵があれば元に戻せ、鍵と一緒に漏れれば全員の平文が分かる。

参考: cheatsheetseries.owasp.org

passwordhashbcryptargon2

この問題を含む セキュリティ のテストを制限時間つきで解く

セキュリティクイズへ