設定
パスワード保存用の bcrypt ハッシュを生成し、パスワードが既存のハッシュと一致するかを検証します。生成モードではコストとバージョンを選び、検証モードではハッシュと確認するパスワードを貼り付けてください。結果にはハッシュの各部分と計算にかかった時間が表示されます。

bcrypt ハッシュは「復号」できません。パスワードが正しいかどうかを確認するには、検証モードを使用してください。すべての計算はブラウザ内で行われ、パスワードがサーバーに送信されることはありません。

パラメータ
4~15

現行バージョン。OpenBSD、Node.js、Python、Go、Rust が生成します。

コストを 1 上げるごとに計算時間は 2 倍になります。OWASP は最低 10 を推奨しています。理想は、サーバーが約 250 ms で計算できる最大の値です。

0 / 72 バイト

仕組み

bcrypt はパスワードの保存を目的に設計されたハッシュ関数です。マイクロ秒で計算できる SHA-256 や MD5 とは異なり、bcrypt は意図的に遅く作られています。そのため、データベースを盗んだ攻撃者がブルートフォースでパスワードを試すには何年もかかります。

各ハッシュには、検証に必要な情報(アルゴリズムのバージョン、コスト、128 ビットのランダムなソルト)がすべて含まれています。そのため同じパスワードでも毎回異なるハッシュになり、ソルトを別に保存する必要はありません。

コストはラウンド数の 2 を底とする対数です。コスト 10 なら 1024 ラウンド、コスト 12 なら 4096 ラウンドを計算します。1 上げるごとに計算時間が 2 倍になるため、アルゴリズムを変えずにハードウェアの性能向上に対応できます。

例

rasmuslerdorf$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1aPHP マニュアルにある password_verify() の例です。検証モードでこのパスワードと一緒に貼り付けると一致します。
abc$2a$06$If6bvum7DFjUnE9p2uDeDu0YHzrHM6tf.iqN8.yx.jNN1ILEf7h0iコスト 6 の jBCrypt のテストベクターです。コストの後の最初の 22 文字がソルト、残りの 31 文字がハッシュ値です。

ユースケース

  • 管理者ユーザーの初期パスワードのハッシュを作成し、データベースに直接挿入する。
  • ユーザーがログインできないときに、パスワードが保存されたハッシュと一致するかを確認する。
  • Laravel、Spring、Django、Node.js アプリのフィクスチャ、シード、自動テスト用のテストハッシュを生成する。
  • サーバーに設定する前に、各コストの計算時間を測定して適切な値を選ぶ。
  • プレフィックス $2y$ の bcrypt ハッシュに対応した Apache の .htpasswd ファイルのエントリを作成する。

よくある質問

bcrypt ハッシュは復号できますか?

いいえ。bcrypt は一方向関数で、ハッシュからパスワードを取り出す方法はありません。できるのは候補のパスワードを試して一致するか確かめることだけで、bcrypt はまさにその作業を遅くするための仕組みです。

$2a$、$2b$、$2y$ の違いは何ですか?

通常のパスワードでは 3 つとも同じ結果を計算します。$2a$ はオリジナルのバージョンです。$2y$ は 2011 年に PHP が、不具合のある実装のハッシュと区別するために導入しました。$2b$ は 2014 年に OpenBSD が、255 文字を超えるパスワードに関する別の不具合を修正した際に採用しました。ほとんどのライブラリは検証時に 3 つすべてを受け付けます。

どのコストを使うべきですか?

OWASP は最低 10 を推奨しています。理想は、サーバーがログイン 1 回あたり約 250 ms で計算できる最大の値です。Spring Security のデフォルトは 10 で、Laravel 11 と PHP 8.4 はデフォルトを 12 に引き上げました。

bcrypt が 72 バイトを超える部分を無視するのはなぜですか?

このアルゴリズムはパスワードを Blowfish の鍵として使い、その鍵は最大 72 バイトまでです。超えた部分は警告なしに切り捨てられるため、先頭 72 バイトが同じ 2 つのパスワードは同じハッシュになります。アクセント付き文字や絵文字は 2~4 バイトを使うため、このツールは文字数ではなくバイト数を数えます。

bcrypt と Argon2 はどちらが優れていますか?

現在、新しいシステムには Argon2id が推奨されています。遅いだけでなく大量のメモリを使うため、GPU による攻撃のコストが上がるからです。それでも bcrypt は適切なコストであれば安全で、PHP、Laravel、Spring、Ruby on Rails のデフォルトです。

パスワードはサーバーに送信されますか?

いいえ。ハッシュの生成と検証はブラウザ内で行われ、パスワードがデバイスの外に出ることはありません。ツールを共有するリンクにも含まれません。