暗号
bcrypt
別称: EksBlowfish ハッシュ, Provos-Mazières bcrypt
定義
Blowfish 暗号の鍵スケジューリングを基にした適応的パスワードハッシュ関数で、1999 年に Provos と Mazières が設計した。
bcrypt は 1999 年に Niels Provos と David Mazières が発表したパスワードハッシュ方式で、改変版 Blowfish 鍵スケジュール(EksBlowfish)を用い、ソルト付きパスワードから 192 ビットのハッシュを導出します。コストパラメーター(鍵セットアップ反復数の log2)を調整することで、ハードウェアの進化に合わせて作業量を時間とともに増やせます。入力長は 72 バイトに固定されており、メモリ使用量も小さいため、メモリ消費型の関数と比べて GPU/ASIC 攻撃に弱いという欠点があります。現在も広く使われており、コスト 12 以上であればパスワード保存にも許容されますが、新規システムでは Argon2id や scrypt が望ましい選択肢です。
例
- Django や Spring Security はデフォルトで bcrypt(コスト 12)を用いてユーザーパスワードを保存する。
- 典型的な bcrypt ハッシュは $2b$12$ で始まり、22 文字のソルトと 31 文字のダイジェストが続く。
関連用語
鍵導出関数(KDF)
パスワードや共有秘密、マスター鍵などの秘密入力から、1 つまたは複数の強力な暗号鍵を導出する暗号関数。
Argon2
2015 年の Password Hashing Competition で優勝し、RFC 9106 に標準化された、メモリ消費型の最新パスワードハッシュ関数兼 KDF。
scrypt
2009 年に Colin Percival が設計し RFC 7914 で標準化された、メモリ消費型のパスワードベース KDF。パスワードハッシュや一部の暗号通貨の Proof-of-Work に利用される。
PBKDF2
PKCS #5 / RFC 8018 で定義されたパスワードベースの鍵導出関数で、設定可能な反復回数とソルトを用いて擬似乱数関数を繰り返し適用する。
ソルト
ハッシュ計算前にパスワードへ付加する一意のランダム値で、レインボーテーブルを無効化し各ユーザーのハッシュを別物にする仕組み。
Blowfish
Bruce Schneier が 1993 年に設計した 64 ビットブロック・可変鍵長の Feistel 暗号。暗号解析的には現役だがブロック長が短く、現在は AES に置き換わっている。