bcrypt Hashジェネレーター

ハッシュを生成

高いほど遅くなり、安全性が増します。12 が無難な既定値です。

古いバックアップから出てきたbcrypt hashと平文パスワードが、本当に一致するか確認したい場面は時々あります。あるいは、特定のcost factorでパスワードからどんなhashが作られるか知りたいこともあります。このツールは両方に対応します。パスワードを入力すると新しいhashを生成し、hashと候補パスワードを貼り付けると検証が成功するかを返します。本番環境のログイン照合と同じ定数時間比較を使います。

bcryptを生成またはverifyする

  1. 1

    modeを選ぶ

    パスワードから新しいhashを生成するか、既存の `$2a$` / `$2b$` / `$2y$` hashに対してパスワードをverifyします。

  2. 2

    生成: 平文とcostを入力

    costは4-14。10-12が一般的です。hashごとに16-byte random saltを作成します。

  3. 3

    verify: hashと平文を貼り付け

    ツールがhashからsaltとcostを抽出し、同じparameterで平文を再hashします。

  4. 4

    結果を読む

    生成modeでは60文字のhashをコピーできます。verify modeでは一致なら緑、不一致なら赤で返します。

検証モードの内部処理

保存済みhashが次のような場合:

$2b$12$mE2n5YqWjKqT9tXg.OQPoeeHZJ9hdSvOt5wFdRRQwl6yE1vWWY3z6

verifierは次を行います。

  1. version(2b)、cost(12)、salt(costの後の最初の22文字)、digest(最後の31文字)をparseします。
  2. 抽出したsaltとcostで候補の平文にbcryptを再実行します。
  3. 得られたdigestを、定数時間比較で元のdigestと比較します。

比較に成功すれば true、どこか違えば false です。

定数時間比較

単純な == で2つの文字列を比較すると、byteが違った時点で戻ります。これはタイミング側チャネルになり、十分なサンプルがあればhashの桁を少しずつ漏らす可能性があります。本番環境のパスワード照合(そしてこのツール)は定数時間比較を使い、常に全byteを調べるため、判定時間が先頭から何byte一致したかに依存しません。

よくある診断ケース

症状 考えられる原因
パスワードは正しいはずなのに検証が失敗する 入力末尾の空白またはBOM。両方を取り除きます。
検証が失敗し、versionが2yである 一部のライブラリは2yを嫌いますが、有効で互換性があります。今後は2bで再ハッシュしてください。
hashが短すぎる / 形式が不正 bcrypt hashではありません。MD5は16進32文字、SHA-1は40文字、bcryptは$区切りで60文字です。
cost不一致の警告 保存済みcostがポリシーの最小値を下回っています。次回ログイン成功時に再ハッシュします。

ログイン時の再ハッシュ

ベストプラクティス: ユーザーがログインに成功したら、保存済みhashのcostが現在のポリシーより低いか確認します。低ければ、新しいcostでパスワードを再ハッシュし、データベースを更新します。数か月かけて、ユーザーにパスワード変更を求めずに全体を引き上げられます。

このツールがしないこと

  • 一括検証 — 1回に1つのhashを扱う設計です。
  • 解読や総当たり攻撃 — 辞書攻撃やrainbow-table攻撃は意図的に対象外です。
  • 平文の復元 — bcryptは一方向です。パスワードを忘れた場合、唯一の道はリセットです。

よくある質問

いいえ。hash化とverifyはブラウザ内で行われます。平文もhashもページの外へ出ません。

hashごとにsaltがrandom生成されるからです。それこそが目的です。同じパスワードを持つ2人のユーザーでも異なるhashになり、rainbow tablesを無効化します。

はい、それが検証モードの役割です。手元のhashを貼り付け、候補パスワードを貼り付けると、ツールが一致するかを確認します。

はい。現代的なvariantはいずれも相互運用できます。digestはversion間で互換性があり、違うのはtagだけです。2000年代の古いシステム由来の一部の$2$ hashは、古い形式を明示的にサポートするライブラリが必要な場合があります。

関連ツール