bcrypt ハッシュ生成・検証
指定したコストで bcrypt によりパスワードをハッシュ化し、パスワードとハッシュを照合し、ハッシュの構成要素を確認できます。
ツールをここにピン留めできます。このブラウザに保存されます。
ツールをピン留めすると、そのステッカーがここに並びます。
指定したコストで bcrypt によりパスワードをハッシュ化し、パスワードとハッシュを照合し、ハッシュの構成要素を確認できます。
パスワードのデータベースは盗まれることがあり、手に入れた人はハードウェアの許す限りの速さで、オフラインでパスワードを推測できます。SHA-256 のような汎用ハッシュは高速に動くよう作られているため、グラフィックカード 1 枚で毎秒数十億の候補を試せます。1999 年に Niels Provos と David Mazières が発表した bcrypt は、Blowfish 暗号の重い鍵セットアップを基にしており、それを設定した回数だけ繰り返すことで、推測 1 回ごとのコストを高くしています。
各ハッシュには、それぞれ固有の 16 バイトのランダムなソルトも含まれます。同じパスワードを使う 2 人のユーザーでも異なるハッシュになり、あるソルト用に事前計算したテーブルは別のソルトには役立ちません。bcrypt ハッシュは復号できません。現実的な攻撃は推測なので、弱いパスワードはコストにかかわらずすぐに見破られます。
コストは、鍵セットアップのラウンド数を底 2 の対数で表したものです。コスト 10 は 1,024 ラウンド、コスト 12 は 4,096 ラウンドです。1 増やすと、ログイン 1 回にかかる時間も、攻撃者の推測 1 回にかかる時間も 2 倍になります。コストはハッシュの中に書き込まれるので、後から上げられます。古いハッシュはそのまま照合でき、ユーザーが次にログインしたときに新しいコストでハッシュ化し直せます。
サーバーがログイン時に許容できる範囲で最も高いコストを選び、10 未満にはしないでください。10 は OWASP Password Storage Cheat Sheet が bcrypt に示している最低値です。ここに表示される時間はブラウザの WebAssembly で計測したもので、通常はサーバー上のネイティブコードより遅いため、実際にハッシュ化を行うマシンで計測してください。このツールがコスト 14 までにしているのもそのためです。
bcrypt が使うのはパスワードの最大 72 バイトです。制限は文字数ではなくバイト数です。UTF-8 では、é のようなアクセント付きの文字は 2 バイト、CJK の文字の多くは 3 バイト、絵文字の多くは 4 バイト以上になります。多くのライブラリは長い入力を何も知らせずに切り詰めるため、先頭 72 バイトが同じ 2 つの長いパスワードは、同じハッシュに対して照合が通ってしまいます。ここで使っている Go の実装は長い入力のハッシュ化を拒否し、このツールはその場合にそのことを知らせます。
ユーザーがそれより長いパスワードを選ぶ可能性があるなら、素直な対処法は、登録時にわかりやすいメッセージを示して拒否することです。よく使われる回避策は、まずパスワードを SHA-256 でハッシュ化し、そのダイジェストを Base64 または hex で表した文字列を bcrypt に渡すものです。ダイジェストの生のバイト列を渡してはいけません。実装によってはゼロバイトで読み取りを止めてしまうためです。また OWASP のチートシートは、password shucking と呼ばれる攻撃の余地を生むとして、この種の事前ハッシュ化を推奨していません。新しいシステムには、OWASP は bcrypt よりも Argon2id を推奨しており、Argon2id には 72 バイトの制限がありません。
bcrypt ハッシュは 60 文字です。$2b$ のようなバージョンのプレフィックス、2 桁のコストと $、22 文字のソルト、31 文字のダイジェストで構成され、ソルトとダイジェストは bcrypt 独自の Base64 アルファベット(./A-Za-z0-9)で書かれます。パスワードの照合に必要な情報はすべてこの 1 つの文字列に入っているので、ソルト用の列を別に保存する必要はありません。
ハッシュ化と照合には、Go の golang.org/x/crypto/bcrypt パッケージを WebAssembly にコンパイルしたものを使い、ブラウザのバックグラウンドスレッドで実行します。パスワードやハッシュはどこにも送信されず、保存もされません。このページは、テストデータやフィクスチャの作成、手元にあるハッシュの確認を目的としています。実際のユーザーのパスワードは、サーバー上のアプリケーションでハッシュ化してください。
ハッシュは毎回新しいランダムなソルトで作られ、そのソルトが結果の一部になるためです。パスワードを照合するとき、bcrypt は保存されたハッシュからソルトとコストを読み取り、同じ計算を繰り返します。そのため照合には verify 関数を使います。もう一度ハッシュ化して文字列同士を比較する方法は使えません。
10 以上にし、サーバーでのログインが許容できる時間内に終わるなら、さらに上げてください。1 上げるごとに時間は 2 倍になるので、本番環境のハードウェアで計測してください。ハードウェアは年々速くなるため、数年ごとに値を見直してください。
特定の実装のバグを受けて行われた改訂を表します。$2y$ は PHP が使う crypt_blowfish の 2011 年の修正に、$2b$ は OpenBSD の 2014 年の修正に由来します。72 バイト以下のパスワードでは、3 つとも同じダイジェストになります。このツールは $2a$ で出力し、3 つすべてを照合できます。
いいえ。ハッシュは WebAssembly モジュールがお使いの端末上で計算し、このツールが入力した内容を含むネットワークリクエストを送ることはありません。次回の訪問まで何かが保存されることもありません。
専用のウィンドウで開き、オフラインでも使えます。
インストールするには、共有ボタンをタップして「ホーム画面に追加」を選びます。