暗号
ソルト
別称: 暗号学的ソルト, パスワードソルト
定義
ハッシュ計算前にパスワードへ付加する一意のランダム値で、レインボーテーブルを無効化し各ユーザーのハッシュを別物にする仕組み。
暗号学的ソルト(salt)は、Argon2、scrypt、bcrypt、PBKDF2 などのハッシュ関数や KDF にパスワードを渡す前に混ぜ込む非秘匿のランダム値です。同じパスワードを使う 2 人のユーザーでも保存ハッシュが異なるため、事前計算済みのレインボーテーブルが無力化され、大規模攻撃はバッチ処理ではなくユーザーごとの線形処理になります。少なくとも 16 バイト、暗号学的に安全な RNG で生成し、認証情報ごとに一意で、ハッシュと一緒に保存します(秘匿の必要はありません)。最新のパスワードハッシュ形式(PHC 文字列、$argon2id$...、$2b$...、$scrypt$... など)はソルトを直接埋め込みます。HKDF やランダム化された公開鍵暗号方式も同じ目的でソルトを使用します。
例
- $argon2id$v=19$m=65536,t=3,p=1$<base64-salt>$<base64-hash> 形式の Argon2id ハッシュ。
- アカウント作成時にユーザーごとに生成する 16 バイトのランダムソルト。
関連用語
ペッパー
ハッシュ計算前に各パスワードへ加算するサーバー側秘密で、データベースとは別の場所に保管し、ハッシュ流出後のオフライン解析を抑制する。
鍵導出関数(KDF)
パスワードや共有秘密、マスター鍵などの秘密入力から、1 つまたは複数の強力な暗号鍵を導出する暗号関数。
Argon2
2015 年の Password Hashing Competition で優勝し、RFC 9106 に標準化された、メモリ消費型の最新パスワードハッシュ関数兼 KDF。
bcrypt
Blowfish 暗号の鍵スケジューリングを基にした適応的パスワードハッシュ関数で、1999 年に Provos と Mazières が設計した。
レインボーテーブル攻撃
ハッシュ関数と還元関数を交互に並べたチェーンを圧縮テーブルに保存し、ソルトなしハッシュを総当たりよりはるかに速く逆引きする事前計算攻撃。
暗号学的ハッシュ関数
任意長の入力を固定長のダイジェストへ写す決定的な一方向関数で、衝突耐性・原像耐性・第二原像耐性を備える。