Bcrypt ハッシュと検証

ブラウザ内でパスワードのソルト付き bcrypt ハッシュを生成し、既存ハッシュと平文を照合します。

ブラウザ内でパスワードのソルト付き bcrypt ハッシュを生成し、既存ハッシュと平文を照合します。 ブラウザ内でパスワードのソルト付き bcrypt ハッシュを生成し、既存ハッシュと平文を照合します。

生成された bcrypt ハッシュ

背景

bcrypt とは何か、なぜ重要なのか

bcrypt は 1999 年に Niels Provos と David Mazieres が設計した適応型パスワード ハッシュ関数です。MD5 や SHA-256 のような高速ダイジェストと違い、bcrypt は 意図的に CPU 時間を消費します。各ハッシュは Blowfish 暗号を設定可能なラウンド 数だけ実行し、コスト係数が 1 上がるごとに作業量は倍増します。この減速こそが オフラインの辞書攻撃や総当たり攻撃を高価にする理由です。正しい実装は出力に 128 ビットのランダムソルトを埋め込むため、同じパスワードのハッシュは常に異な り、レインボーテーブルは無力です。

bcrypt ハッシュの読み方

bcrypt ハッシュは $2b$12$e0.6kJ8a5X8u5Yp3qR5E0e9dF4z3W2c1v0b9n8m7l6k5j4h3g2f1 のような形をしています。先頭のドル記号の後の各セグメントがアルゴリズム版、 コスト、ソルトを示します:

  • $2b$ -- アルゴリズムのリビジョン。$2a$$2y$ は 8 ビット符号ビット の扱いが微妙に異なる旧バリアントで、$2b$ が現在の推奨であり bcryptjs が 出力する形式です。
  • 12 -- コスト係数。2^12 = 4096 ラウンドの鍵スケジュール。+1 ごとに時間が 倍になります。対話型ログインなら 10〜12、保存する認証情報なら 12〜14 が 適切です。
  • 残りの 53 文字は 22 文字(128 ビット)の base64 ソルトと 31 文字(184 ビット) のチェックサムを含みます。文字列全体が自己完結した記録であり、検証側は ハッシュからバージョン・コスト・ソルトを読み戻して派生処理を再実行します。

このツールの使い方

入力欄にパスワードを入力し、コスト係数を選んで「ハッシュ化」を押します。 生成されたハッシュは出力欄に表示され、検証欄にも自動入力されます。既存の ハッシュを確認するには検証欄に貼り付け、入力欄に候補パスワードを入力します。 ページは即座に比較し、緑のチェックか赤いバツを表示します。bcrypt.compareSync で比較するため、間違った推測がどの程度近かったかを明かすことはありません。 毎回フルハッシュしてから結果が決まります。

セキュリティ上の注意と制限

bcrypt は入力を 72 バイトに切り詰めます。長いパスワードは黙って切り捨てられ、 最初の 72 バイトが同じ 2 つのパスワードは同一と判定されます。より長い入力を 扱うなら SHA-256(16 進)で事前ハッシュし、そのダイジェストに bcrypt を適用 してください。bcrypt は意図的にメモリ軽量なアルゴリズムで、Argon2 や scrypt のようなメモリハード設計ほど GPU アレイに強くありませんが、4KB のテーブルと 64 バイトの状態でも安価な ASIC クラックは魅力に欠けます。新規システムには Argon2id が適していますが、bcrypt はレガシー互換性と Argon2 が使えない環境で 優れた選択肢であり続けます。このページは完全にブラウザ内で動作し、パスワード とハッシュが端末の外に出ることはありません。

BSD-3-Clause の bcryptjs ライブラリ(public/assets に同梱)を使用。ハッシュ化はローカルで行われ、送信はありません。

よくある質問

同じパスワードなのに毎回違うハッシュになるのはなぜ?
ハッシュごとに 128 ビットのランダムソルトが生成され、出力に埋め込まれます。検証時はハッシュからソルトを読み戻すため正確性は変わりませんが、同じ入力でも出力は常に異なります。
コスト係数はどれくらいにすればよい?
対話型ログインなら 10〜12 が適切です。保存する認証情報なら 12〜14 を推奨します。コストが高いほど安全ですが遅くなります。サーバが 1 ログインあたりに許容できる最大値を選んでください。
2026 年でも bcrypt は推奨されますか?
はい。bcrypt は今も広く使われており、コスト 10 以上なら安全と見なされています。新規システムではメモリハードな Argon2id や scrypt が好まれることが多いですが、特にそれらが使えない環境では bcrypt は実績ある優れた選択肢です。
なぜ bcrypt は SHA-256 より遅いのですか?
それが狙いです。SHA-256 は高速化のために設計されており、攻撃者は毎秒数十億回の推測を試せます。bcrypt は高価な鍵スケジュールとソルトにより 1 回の推測に実時間をかけさせ、オフライン攻撃を非現実的にします。
72 バイト制限はパスワードにどう影響しますか?
bcrypt は 72 バイト以降を無視します。72 バイトを超え同じ接頭辞を持つ 2 つのパスワードは同一と判定されます。より長い秘密を扱うには SHA-256(16 進)で事前ハッシュし、そのダイジェストに bcrypt を適用してください。
パスワードはサーバに送信されますか?
いいえ。同梱の bcryptjs ライブラリで全てブラウザ内で完結します。ページ読み込み後にネットワークを切断しても動作します。