SHA-256 のような高速なハッシュ関数では、攻撃者は GPU で 1 秒あたり数十億回の推測を試せます。パスワードハッシュは、パスワードごとに固有のランダムなソルト(事前計算テーブルを無効にします)と、調整可能なコストを加えます。OWASP のパスワード保存チートシートは、推奨順に次を挙げています。Argon2id(RFC 9106。メモリ 19 MiB 以上、反復回数 2、並列度 1)、scrypt(N = 2¹⁷、r = 8、p = 1)、bcrypt(ワークファクター 10 以上。入力は 72 バイトで切り詰められます)、そして FIPS 140 が求められる場合は PBKDF2-HMAC-SHA256(反復回数 600,000 回以上)です。
アルゴリズムとパラメーターをハッシュ値と一緒に保存してください(PHC 文字列形式の $argon2id$v=19$m=19456,t=2,p=1$…、bcrypt の $2b$10$…)。そうすれば、後からコストを引き上げ、古いハッシュ値を次回のログイン時にアップグレードできます。任意で使うペッパーは、データベースの外に保管するシークレットで、データベースだけが漏洩した場合の保護を強化します。
NIST SP 800-63B-4 は、ソルトを付けてコストを高めた保存を求め、単一の認証要素として使うパスワードには最低 15 文字の長さを求めています。パスキーでは、保存されるシークレットそのものがなくなります。サーバーが保持するのは公開鍵だけです。