セキュリティ: bcrypt はパスワードの先頭 72 バイトしか見ない
bcrypt は入力の先頭 72 バイト以降を捨てる。長いパスフレーズや「末尾だけ違う」パスワードが同じハッシュになる。
使う場面
ユーザーに長いパスフレーズを許している、またはパスワードの末尾に pepper / サイト固有文字列を足している実装。認証まわりのレビューや「なぜ通ったか」の調査時。
やり方
- 事実の確認: 先頭 72 バイトが同じなら、それ以降が違っても
bcrypt.compareは成功する。 - 対策の例:
- より新しいアルゴリズム(Argon2id など)へ移行する(関連: Go: Argon2id のハッシュ計算はセマフォで同時実行数を絞る(ログイン集中でメモリが溢れるのを防ぐ))。
- どうしても bcrypt を使うなら、先に SHA-256 などでダイジェストしてから bcrypt する(長さを固定し、72 バイト問題を避ける)。ライブラリや OWASP の推奨手順に従う。
- 最大長を UI / API で明示し、72 バイトを超える入力を拒否または警告する。
注意点
- 「バイト」であり「文字」ではない。UTF-8 の多バイト文字では 72 文字より早く切れる。
- 先行ハッシュ(SHA-256 → bcrypt)は salt の扱い・エンコード(hex / raw)を一貫させないと検証できない。既存ハッシュの移行計画が必要。
- ニュースや脆弱性報告で bcrypt が話題になったときの「試したくなるテスト」としても知られるが、本番の他人のアカウントで試さないこと。