bcrypt Hashジェネレーター
ハッシュを生成
高いほど遅くなり、安全性が増します。12 が無難な既定値です。
古いバックアップから出てきたbcrypt hashと平文パスワードが、本当に一致するか確認したい場面は時々あります。あるいは、特定のcost factorでパスワードからどんなhashが作られるか知りたいこともあります。このツールは両方に対応します。パスワードを入力すると新しいhashを生成し、hashと候補パスワードを貼り付けると検証が成功するかを返します。本番環境のログイン照合と同じ定数時間比較を使います。
bcryptを生成またはverifyする
-
1
modeを選ぶ
パスワードから新しいhashを生成するか、既存の `$2a$` / `$2b$` / `$2y$` hashに対してパスワードをverifyします。
-
2
生成: 平文とcostを入力
costは4-14。10-12が一般的です。hashごとに16-byte random saltを作成します。
-
3
verify: hashと平文を貼り付け
ツールがhashからsaltとcostを抽出し、同じparameterで平文を再hashします。
-
4
結果を読む
生成modeでは60文字のhashをコピーできます。verify modeでは一致なら緑、不一致なら赤で返します。
検証モードの内部処理
保存済みhashが次のような場合:
$2b$12$mE2n5YqWjKqT9tXg.OQPoeeHZJ9hdSvOt5wFdRRQwl6yE1vWWY3z6
verifierは次を行います。
- version(
2b)、cost(12)、salt(costの後の最初の22文字)、digest(最後の31文字)をparseします。 - 抽出したsaltとcostで候補の平文にbcryptを再実行します。
- 得られた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は、古い形式を明示的にサポートするライブラリが必要な場合があります。
関連ツール
AES暗号化 / 復号
OpenSSLのAES暗号方式で低リスクのテキストを暗号化・復号します。パスフレーズはSHA-256でハッシュされ、Base64出力はIVと暗号文です。
Atbash暗号エンコーダー
A-ZをZ-Aに対応させるヘブライ系の換字式暗号、Atbashでテキストをエンコードまたはデコードできます。同じ操作で暗号化と復号ができます。
A1Z26暗号エンコーダー
A1Z26暗号(A=1、B=2、... Z=26)でテキストをエンコード、または数字列を文字へデコードできます。区切り文字も選べます。
bcryptジェネレーター
平文パスワードからbcrypt hashを生成します。cost factorは4から14まで調整でき、Laravel、Django、Node、PHPと互換性があります。
Base32エンコーダー・デコーダー
RFC 4648アルファベットでBase32文字列をエンコード・デコードします。TOTPシークレット、大文字小文字を区別しないトークン、人が入力する識別子に便利です。
Base85エンコーダー・デコーダー
Adobe Ascii85(PostScript/PDF)またはZ85(ZeroMQ)形式でBase85をエンコード・デコードします。バイナリデータではBase64よりコンパクトです。