Bcrypt パスワードを ハッシュ化
ブラウザで安全なBcryptパスワードハッシュを即座に生成。コストファクターを選択し、クライアントサイドでハッシュ化 — 完全プライベートかつ無料。
ブラウザで安全なBcryptパスワードハッシュを即座に生成。コストファクターを選択し、クライアントサイドでハッシュ化 — 完全プライベートかつ無料。
bcrypt は、1999 年に Niels Provos と David Mazières によって設計された、Blowfish 暗号から派生したパスワード ハッシュ関数です。 SHA-256 のような汎用ハッシュ関数とは異なり、bcrypt は意図的に遅く、コスト パラメーターを介して構成的に遅くなります。これはまさにパスワード ハッシュに必要な特性です。より高速なハッシュ関数により、攻撃者は 1 秒あたりにより多くの候補を総当たり攻撃できるようになります。遅いものはそれらを制限します。
また、bcrypt はパスワードごとのソルトを自動的に組み込み、事前計算されたレインボー テーブルに基づく攻撃のクラス全体を排除します。ソルトとコストのパラメータは bcrypt 出力の一部として保存されるため、検証には保存されたハッシュと候補パスワードのみが必要となり、個別のソルト管理は必要ありません。この遅さ、ソルト、自己完結型形式の組み合わせにより、bcrypt が 20 年間デフォルトのパスワード ハッシュとなり、今日でも有力な選択肢となっています。
現代的な代替手段が存在します。 Argon2 は 2015 年のパスワード ハッシュ コンペティションで優勝しており、時間耐久性に加えてメモリ耐久性も備えています。 scrypt も同様のプロパティを提供します。新しいデザインの場合は、Argon2id を選択することをお勧めします。 bcrypt は依然として許容されており、特に Argon2 が利用できない環境では広く導入されています。
パスワードを平文で保存することは違法行為です。 SHA-256 のような高速ハッシュで保存することはほとんど改善されません。最新の GPU は 1 秒あたり数十億の SHA-256 ハッシュを計算するため、一般的なパスワードに対するブルート フォース攻撃が数時間で実行可能になります。 bcrypt の意図的な遅さは経済性を変化させます。コスト係数 12 では、攻撃者は候補パスワードごとに約 250 ミリ秒を費やし、重要なパスワードに対する総当たり攻撃は非現実的になります。
bcrypt のパスワードごとの自動ソルトも、レインボー テーブル攻撃を無効にします。同じパスワードを持つ 2 人のユーザーは、ソルトが異なるため、異なる bcrypt ハッシュを生成します。パスワード データベースを侵害しても、攻撃者は一般的なパスワードや事前計算されたテーブルのヒットをすぐに特定できません。
パスワードを入力し、コストを選択し、ハッシュを取得します。
bcrypt は、修正された Blowfish 暗号の鍵セットアップ フェーズを使用し、2^ コスト回繰り返します。コスト係数は対数的です。コスト 12 はコスト 11 の 2 倍、コスト 10 の 4 倍遅くなります。この対数スケーリングにより、管理者はシステムを再設計することなく、ハードウェアの改善に応じてコストを徐々に増加させることができます。
出力形式は $version$cost$saltAndHash です。saltAndHash はカスタム アルファベットで Base64 エンコードされています。通常、バージョンは $2b$ (ラップアラウンド バグが修正された最新のバージョン) または $2y$ (PHP 固有、同等) です。ソルトは 16 バイトです。ハッシュは 24 バイトです。これらは一緒に、custom-base64 の 53 文字にエンコードされます。
最大入力長は 72 バイトです (Blowfish キーの長さ制限)。長いパスワードは黙って切り捨てられますが、これは bcrypt の長年の癖です。ベスト プラクティスは、パスワードの長さを 72 バイトに制限するか、bcrypt の前に SHA-256 で事前ハッシュして長さを正規化することです。