bcrypt とは?
Bcryptは、Niels Provos氏とDavid Mazières氏によって設計されたパスワードハッシュ化関数で、Blowfish暗号に基づいています。MD5やSHA-256のような高速ダイジェストとは異なり、bcryptは意図的に低速で計算コストが高くなるように設計されています——これにより、盗まれたパスワードハッシュへのブルートフォース攻撃が非現実的になります。Bcryptはパスワードごとに自動的にランダムなソルトを生成するため、同じパスワードでも異なるハッシュが生成されます。
bcrypt の仕組み
Bcryptアルゴリズムは完全にブラウザ内で実行されます。以下が段階的なプロセスです:
- パスワードがUTF-8バイトとしてエンコードされ、bcryptの鍵スケジュールに入力されます。鍵スケジュールはパスワードとソルトを使用してBlowfish暗号の4,184バイトのP配列とSボックスを初期化します。
- ランダムな128ビットのソルトが生成されます。ソルトは鍵スケジュールに混入されるため、一意のソルトごとに同じパスワードでも完全に異なるハッシュが生成されます。
- 鍵スケジュールは2^costラウンド(例:コスト10の場合は2^10 = 1,024回の反復)実行されます。各反復でソルトとP配列エントリが再暗号化され、コストが増加するにつれて計算が比例して遅くなります。
- 最終出力は60文字の文字列で、形式は
$2b$<cost>$<salt><hash>です。costはゼロ埋め(例:10)、saltは22文字のBase64、hashは31文字のBase64です。 - 検証時は、候補パスワードと保存されたハッシュから抽出したソルトを使用して、同じアルゴリズムが再度実行されます。派生したハッシュが保存されたハッシュと一致すれば、パスワードは正しいです。
どのコスト係数を使うべきですか?
コスト係数は反復回数の対数です——コスト10は2^10 = 1,024ラウンド、コスト12は4,096ラウンドを意味します。セキュリティ要件とハードウェアに基づいて選択してください:
- コスト4-6(16-64ラウンド)——開発とテストのみ。本番環境では速すぎて保護が不十分です。
- コスト8(256ラウンド)——重要でないアプリケーションの最低限。現代のハードウェアで約6ms。
- コスト10(1,024ラウンド)——現在推奨されるベースライン。約25ms。ほとんどのWebアプリケーションに適しています。
- コスト12(4,096ラウンド)——管理ポータル、金融システム、高セキュリティアプリに推奨。約100ms。
- コスト14(16,384ラウンド)——高セキュリティ。約400ms。マスターパスワード、暗号化キー、またはログイン遅延が許容される場合に使用。
このbcrypt生成器を使う理由
- プライバシー保護——すべてのパスワードはブラウザ内でローカルにハッシュ化され、データがデバイスから送信されることはありません。
- デュアルモード——ページを切り替えることなく、新しいハッシュの生成と既存ハッシュの検証を並行して行えます。
- 調整可能なコスト係数——作業係数を4(高速)から15(非常に低速)まで調整し、アプリケーションのセキュリティ要件に合わせられます。
- 標準準拠——生成されるハッシュは標準の
$2b$形式で、主要な言語とフレームワークすべてと互換性があります。
bcrypt の一般的な用途
Bcryptは業界全体でパスワードの保存と検証に広く使用されています:
- Webアプリケーションのユーザー認証——ユーザーパスワードのハッシュをデータベースに保存し、平文パスワードが保存されることがないようにします。
- APIキーのハッシュ化——APIシークレットを保存前にハッシュ化することで、データベース侵害が有効な認証情報を漏洩することを防ぎます。
- 移行監査——古いシステムからのレガシーパスワードハッシュが、認証層のアップグレード後もユーザーを認証できることを確認します。
bcrypt ハッシュの例
コスト係数10でパスワード hunter2 をハッシュ化すると、$2b$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy のような文字列が生成されます。形式の内訳は:$2b$(アルゴリズムバージョン)、10(コスト係数)、$、続いて22文字のソルトと31文字のハッシュ(すべてBase64エンコード)です。同じパスワードでもランダムなソルトのため、実行のたびに異なるハッシュが生成されます。
このbcrypt生成器は、純粋なJavaScript実装を使用してブラウザ内で完全に実行されます。保存前にパスワードをハッシュ化し、既存のハッシュを検証し、コスト係数を調整してセキュリティ要件に合わせる——すべてサーバーに1バイトも送信することなく行えます。