用語集

bcrypt とは?

bcryptはBlowfishブロック暗号に基づくパスワードハッシュ関数であり、組み込みのソルトと設定可能なコストファクターを持ち、GPUやカスタムハードウェアによるアクセラレーションに特に耐性を持つ形で計算コストが高くなるよう設計されています。

別名: bcrypt hash, Blowfish crypt

bcryptは1999年にNiels ProvosとDavid Mazieresによって、ほとんどのシステムがMD5やSHA-1などの高速ハッシュ関数を使用していた時代に、パスワードハッシュ化専用に設計されました。主要なイノベーションはコストファクターで、基礎となるBlowfishキーセットアップの反復回数を制御するパラメーターです。コストファクターを1増やすたびに計算時間が2倍になり、ハードウェアの高速化に合わせて難易度を調整できます。

bcryptをPBKDF2と区別するのはGPUアクセラレーションへの耐性です。PBKDF2はGPUアーキテクチャにマッピングしやすいHMAC操作を使用し、コンシューマーGPUを持つ攻撃者が大規模な並列処理を実現できます。bcryptのBlowfishベースのキースケジュールは、計算中に変更される必要がある4KBの状態テーブルへの頻繁なアクセスを必要とします。このメモリアクセスパターンはGPU上で効率的に並列化できず、攻撃者をCPU速度の攻撃に制限します。

bcryptは、アルゴリズムバージョン、コストファクター、ソルト、ハッシュをエンコードした60文字の文字列を生成します。これにより自己完結型でポータブルになります。典型的なbcryptハッシュは$2b$12$...のような形をしており、12はコストファクターです。現在推奨される最小コストファクターは10(現代のハードウェアでハッシュあたり約100ms)ですが、わずかに遅いログイン時間を許容できるアプリケーションでは12〜14が一般的です。bcryptはほぼすべてのプログラミング言語で利用可能で、最も広く使われているパスワードハッシュ化アルゴリズムの一つです。

Vaulted における bcrypt の使われ方

VaultedはbcryptではなくPBKDF2をパスフレーズベースのキー導出に使用しています。これは、PBKDF2がブラウザのWeb Crypto APIを通じてネイティブに利用可能であるのに対し、bcryptはそうではないからです。Web Crypto APIはbcryptを公開していないため、使用するにはネイティブの定数時間実行のセキュリティ上の利点を犠牲にするJavaScript実装が必要になります。認証のためにパスワードをハッシュ化するサーバーサイドアプリケーションにとって、bcryptは優れた選択肢です。しかし、ブラウザでのクライアントサイドキー導出には、Web Crypto経由のPBKDF2が標準的なアプローチです。