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に渡す。
⚠️ 低すぎるコスト係数
症状:古いシステムでコスト係数が低いまま
対策:ユーザーのログイン時にハッシュを再計算して更新。
権威あるリソース
関連用語
📝 関連ブログ記事
よくある質問(FAQ)
Q. bcryptとは何ですか?
bcryptは1999年にNiels Provos・David Mazièresが開発したパスワードハッシュアルゴリズムです。Blowfish暗号を基に設計され、コストパラメータ(work factor)を設定することで計算コストを調整できます。現在もPHP、Node.js、Ruby等の多くのフレームワークのデフォルトパスワードハッシュとして広く使われています。
Q. bcryptのコストパラメータは何を意味しますか?
bcryptのコストパラメータ(work factor)は2^nの計算ラウンド数を意味します。コスト10なら1024ラウンド、コスト12なら4096ラウンドです。OWASPは2024年時点でコスト10以上を推奨し、ハードウェアの向上に合わせて適宜引き上げることを求めています。通常のWebサーバーではコスト10〜12程度が適切です。
Q. bcryptとArgon2はどちらを使うべきですか?
新規システムではArgon2id(OWASPの第一推奨)を使うべきです。bcryptはパスワード長が72バイトに制限されており(72文字以上が切り捨て)、メモリコストが固定(4KB)のため現代のGPU/ASICでのブルートフォースに弱くなっています。ただし、既存のbcryptシステムが適切なコストパラメータで動作していれば、直ちに移行しなくても大きなリスクはありません。
Q. bcryptハッシュの形式はどうなっていますか?
bcryptハッシュは$2b$12$[22文字のソルト][31文字のハッシュ]という形式です。例:$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewdBPj/n6oEzD8mq。$2b$はバージョン(最新)、12はコストパラメータ、その後にBase64エンコードされたソルトとハッシュが続きます。ソルトはbcryptが自動生成するため、開発者がソルトを管理する必要はありません。
