bcrypt
bcrypt とは何ですか?
bcryptBlowfish 暗号の鍵スケジューリングを基にした適応的パスワードハッシュ関数で、1999 年に Provos と Mazières が設計した。
bcrypt は 1999 年に Niels Provos と David Mazières が発表したパスワードハッシュ方式(USENIX 論文 "A Future-Adaptable Password Scheme")で、改変版の Blowfish 鍵スケジュール(「EksBlowfish」)を用い、ソルト付きパスワードから 192 ビットのハッシュを導出します。コストの高い鍵セットアップ段階では、繰り返しの鍵拡張を通じてソルトとパスワードを交互に織り込み、その後、定数文字列 "OrpheanBeholderScryDoubt" を 64 回暗号化します。そのコストパラメーター(鍵セットアップのラウンド数の log2)により、防御側はハードウェアの進歩に合わせて作業量を引き上げられます。コスト 12 は 2^12 = 4096 回の反復を意味します。
bcrypt を特徴づける癖の一つが、72 バイトという厳格な入力上限です。第 72 バイトを超える部分はすべて静かに切り詰められます。これが 2024 年 10 月の Okta AD/LDAP 委任認証インシデントを引き起こしました。Okta は userId + username + password を bcrypt でハッシュ化してキャッシュキーを構築していましたが、ユーザー名が 52 文字以上のユーザーではパスワードが 72 バイトの切り捨て位置を超えて無視され、以前にキャッシュされた資格情報で認証が通ってしまいました。教訓は、bcrypt の前に長い入力を事前ハッシュする(例:SHA-256 の後に Base64)か、この制限のない関数を使うことです。
bcrypt はメモリ使用量が小さく固定的であるため、GPU/ASIC によるクラッキングに対してメモリ消費型の設計よりも弱くなります。コスト >= 12 であれば依然として許容されますが、OWASP は現在、新規システムには Argon2id(または scrypt)を推奨しています。
flowchart TD
P[Password + 128-bit salt] --> T{Input > 72 bytes?}
T -->|Yes| TR[Bytes 73+ silently truncated]
T -->|No| K
TR --> K[EksBlowfish key setup]
K --> C[Cost: repeat key schedule 2^cost times]
C --> E["Encrypt 'OrpheanBeholderScryDoubt' x64"]
E --> H["$2b$12$salt + 184-bit digest"]● 例
- 01
Django や Spring Security はデフォルトで bcrypt(コスト 12)を用いてユーザーパスワードを保存する。
- 02
典型的な bcrypt ハッシュは $2b$12$ で始まり、22 文字のソルトと 31 文字のダイジェストが続く。
● よくある質問
bcrypt とは何ですか?
Blowfish 暗号の鍵スケジューリングを基にした適応的パスワードハッシュ関数で、1999 年に Provos と Mazières が設計した。 サイバーセキュリティの 暗号 カテゴリに属します。
bcrypt とはどういう意味ですか?
Blowfish 暗号の鍵スケジューリングを基にした適応的パスワードハッシュ関数で、1999 年に Provos と Mazières が設計した。
bcrypt からどのように防御しますか?
bcrypt に対する防御は通常、上記の定義で述べたとおり、技術的統制と運用上の実践を組み合わせます。
bcrypt の別名は何ですか?
一般的な別名: EksBlowfish ハッシュ, Provos-Mazières bcrypt。