BCryptハッシュの計算
入力した文字列のBCryptハッシュ値をブラウザ上で計算します。ラウンド数(コストファクター)を調整でき、計算はすべてブラウザ内で行われるため入力内容はサーバーに送信されません。
| 文字列 | |
|---|---|
| ラウンド回数 |
※ハッシュ値はWebブラウザ上で計算されます。入力された文字列と計算されたハッシュ値のいずれもサーバーに送信されることはありません。
BCryptハッシュとは
BCryptは、パスワードを保存するために設計されたハッシュアルゴリズムです。SHA-256のような高速なハッシュ関数と違い、意図的に計算を重くしてある点が最大の特徴で、攻撃者が大量の候補を試す速度を物理的に抑え込みます。このツールでは、任意の文字列とラウンド数を指定して、実際のBCryptハッシュをその場で生成できます。
計算はすべてブラウザ内のJavaScriptで完結し、入力した文字列も生成したハッシュもサーバーへ送られません。ただし生成したハッシュを本番のパスワードとして使う場合は、実際に運用するサーバーの性能に合わせてラウンド数を決め直してください。手元の端末で快適な設定が、本番の応答時間として妥当とは限りません。
BCryptハッシュの計算手順
- ハッシュ化したい文字列を入力する 「文字列」欄にパスワードなどの対象を入力します。入力内容は外部へ送信されません。
- ラウンド数を決める ラウンド数はコストファクターとも呼ばれ、1増やすごとに計算時間が約2倍になります。用途が決まっていなければ10から試してください。
- 計算する 「計算する」を押すとハッシュ値が表示されます。ラウンド数が大きいほど結果が出るまで時間がかかります。
- 結果の構造を確かめる 出力は識別子・ラウンド数・ソルト・ハッシュ本体が1つの文字列に連結された形です。この文字列だけを保存すれば照合できます。
使いこなすためのヒント
- BCrypt はソルトを自動的に付与するため、同じ文字列でもハッシュ化のたびに異なる値が生成されます。
- ラウンド数(コストファクター)を増やすと計算コストが上がり、総当たり攻撃への耐性が高まります。一般的に 10〜12 が推奨値です。
- PHP では
password_hash($password, PASSWORD_BCRYPT)、Ruby ではbcrypt-rubygem で同等のハッシュを生成できます。 - ハッシュ値の先頭
$2y$はアルゴリズム識別子、その後の数字がラウンド数を表します。 - より新しい Argon2(PHP 7.2 以降対応)もパスワード保存に適したアルゴリズムです。試してみたい場合はArgon2ハッシュ計算をご利用ください。
BCryptハッシュ計算の活用シーン
開発中のテストユーザーを用意する
データベースへ直接テストアカウントを入れたいとき、任意のパスワードのハッシュをここで作って挿入できます。アプリを起動せずに済みます。
ラウンド数と処理時間の関係を体感する
同じ文字列でラウンド数だけを変えて計算すると、1増やすごとに時間が倍増する様子が実際に確認できます。本番設定を決める判断材料になります。
既存ハッシュの設定を読み解く
運用中のシステムに保存されているハッシュと見比べれば、そのシステムがどのラウンド数で運用されているかを確認できます。
他のアルゴリズムと比較する
同じ文字列を Argon2 でも計算して出力形式や所要時間を並べると、どちらを採用するかの検討材料になります。
BCryptに関する用語
- ソルト
- ハッシュ化の前に文字列へ加えるランダムな値です。同じパスワードでも保存される値が変わるため、事前計算した表による一括解読を防げます。
- ラウンド回数
- コストファクターとも呼ばれ、計算の繰り返し回数を決める指定です。1増やすごとに所要時間がおよそ2倍になります。
- コストファクター
- ラウンド回数と同じものを指す呼び方です。攻撃者の試行速度を抑えるために、あえて計算を重くする度合いを表します。
- レインボーテーブル
- よくあるパスワードとそのハッシュ値をあらかじめ並べた対応表です。ソルトが付いていると値が一致しなくなるため、この攻撃は成立しなくなります。
- アルゴリズム識別子
- ハッシュ文字列の先頭に付く
$2y$のような印です。どの方式で作られたハッシュかを、検証する側が判別するために使います。 - Argon2
- 2015年のパスワードハッシュ競技会で選ばれた新しい方式です。計算時間に加えて必要なメモリ量も指定でき、専用ハードウェアによる攻撃に強いとされています。
よくある質問
password_verify() 等の関数がハッシュ内のソルトを参照して照合します。password_verify() や他の言語の BCrypt 検証関数でそのまま照合できます。ただし入力内容の取り扱いには十分ご注意ください。
余談ですが ― パスワードとハッシュの攻防 ― なぜBCryptが選ばれるのか
2012年のLinkedIn漏洩事件では、約650万件のパスワードが ソルトなしのSHA-1 のみで保存されており、レインボーテーブル攻撃によって数日で大半が解読されてしまいました。この事件はパスワード保存の設計に大きな警鐘を鳴らしました。
現代の高性能GPU(NVIDIA RTX 4090)はMD5を毎秒約680億回計算できます。BCryptは意図的に計算コストを高く設計しており、ラウンド数12の設定では毎秒数千回程度に抑えられるため、総当たり攻撃への耐性が格段に高くなります。同じ計算能力でも、MD5なら秒間680億回試せるところをBCryptなら数千回しか試せない ― この差が重要です。
BCryptはもともと1999年にOpenBSD向けに設計されたアルゴリズムです。20年以上経った現在でも現役で使われており、新しい Argon2(PHP 7.2以降で対応)と並んでパスワード保存の標準的な選択肢となっています。