bcryptとは
bcryptは、1999年にNiels ProvosとDavid Mazièresによって設計されたパスワードハッシュ関数です。Blowfish暗号を基盤とし、意図的に計算コストを高くすることで、ブルートフォース攻撃やレインボーテーブル攻撃に対して強い耐性を持ちます。
bcryptの最大の特徴はコスト係数(work factor)で、ハードウェアの性能向上に合わせて計算コストを調整できます。現在でも広く使用されており、Ruby on Rails、Django、Node.jsなど多くのフレームワークで標準的に採用されています。
bcryptの特徴
- 自動的なソルト生成:ハッシュにソルトが含まれる
- 調整可能なコスト係数:2^n回の反復(nがコスト係数)
- 固定長出力:60文字のハッシュ文字列
- GPU攻撃への耐性:メモリアクセスパターンがGPU最適化を困難に
AIエンジニアとしての実体験
AIエンジニアとして、ユーザー認証システムを構築する際、bcryptは必須の選択肢です。以下は各言語での実装例:
Python
import bcrypt
# パスワードのハッシュ化
password = b"my_secure_password"
salt = bcrypt.gensalt(rounds=12) # コスト係数12
hashed = bcrypt.hashpw(password, salt)
# パスワードの検証
if bcrypt.checkpw(password, hashed):
print("認証成功")
Node.js
const bcrypt = require('bcrypt');
const saltRounds = 12;
// ハッシュ化
const hash = await bcrypt.hash('my_password', saltRounds);
// 検証
const match = await bcrypt.compare('my_password', hash);
コスト係数の選び方
| コスト係数 | おおよその処理時間 | 推奨用途 |
|---|---|---|
| 10 | 〜100ms | 開発・テスト環境 |
| 12 | 〜300ms | ✅ 一般的な本番環境 |
| 14 | 〜1秒 | 高セキュリティ要件 |
最新動向(2026年)
Argon2との比較
2015年のPassword Hashing Competitionで優勝したArgon2は、bcryptの後継として推奨されています。しかし、bcryptは依然として安全であり、既存システムで広く使用されています。
推奨事項
- 新規システム:Argon2idを推奨
- 既存システム:bcryptは引き続き安全、コスト係数を定期的に見直し
トラブル事例と対策
⚠️ 72バイト制限
症状:bcryptは入力を72バイトで切り捨てる
対策:長いパスワードはSHA-256でプリハッシュしてからbcryptに渡す。
⚠️ 低すぎるコスト係数
症状:古いシステムでコスト係数が低いまま
対策:ユーザーのログイン時にハッシュを再計算して更新。
