Bcrypt ハッシュ生成・検証
bcrypt のハッシュをブラウザーで生成・検証。$2b$・$2y$・$2a$ とコスト 4〜31 を選べ、72 バイトの上限や、Laravel・PHP・Node.js・Go・Spring がそのハッシュを受け付けるかを表示します。パスワードは送信しません。
- ブラウザ内で処理
- データはブラウザ外に出ません
- 無料 · 登録不要
WeChat でスキャンしてシェア
例・詳しい説明・よくある質問 実際の出力つきの例、ほかのツールとの違い、よくある質問。
例:Node.js のユーザーを Laravel に移すと例外になる
Node.js の bcrypt 6.0.0 で sakura-2026 をハッシュ化すると $2b$ で始まる値になります(2026-10-02 に作成)。これをそのまま Laravel 13 の users テーブルに入れて Hash::check() にかけると、RuntimeException: This password does not use the Bcrypt algorithm. が投げられました。
$2b$10$dr1dD/1ObGWVj9/VD5K4Levz1e6tjkJQ2IsrpOaXacIoYkknmfKoq
原因は Laravel の「ハッシュアルゴリズムの検証」です。HASH_VERIFY が true(既定)のとき、PHP の password_get_info() が bcrypt と判定したハッシュしか受け付けず、この関数が bcrypt と認めるのは $2y$ だけです(Laravel 12.x ハッシュ)。このツールの「検証」タブは上の値を「一致」と判定したうえで、$2y$10$dr1dD/1ObGWVj9/VD5K4Levz1e6tjkJQ2IsrpOaXacIoYkknmfKoq を表示します。接頭辞を書き換えたこの値なら、同じ Laravel で true が返りました。.env に HASH_VERIFY=false を書く方法もありますが、アルゴリズムの取り違えを検出する仕組みを止めることになります。
逆向き、つまり Laravel の Hash::make(‘sakura-2026’) が出力した次の値を Node.js の bcrypt.compareSync() に渡すと false になります。この場合は $2b$ に書き換えます。
$2y$12$IFeiEsY7tOL6S.EkDs8m1.JTzRFijXd15g3jHqCEYshCcNuewc6kS
ライブラリーごとの受け付け方
UTF-8 のパスワードなら $2a$・$2b$・$2y$ は同じアルゴリズムです。$2y$ は crypt_blowfish が 8 ビット文字のバグ(CVE-2011-2483)を直したあとの印、$2b$ は OpenBSD が 2014 年に導入した印で、crypt_blowfish 1.3 は $2b$ を $2y$ と「まったく同じ」に扱います(Openwall)。差が出るのは受け付けるかどうかで、2026-10-02 に同じハッシュを各ライブラリーで照合した結果は次のとおりです。
| ライブラリー | バージョン | $2a$ | $2b$ | $2y$ | 72 バイト超の生成 | 出力 |
|---|---|---|---|---|---|---|
Laravel Hash::check | 13.34.0 | ⚠ 例外 | ⚠ 例外 | ✓ | ✂ 切り捨て | $2y$12$ |
PHP password_verify | 8.4.26 | ✓ | ✓ | ✓ | ✂ 切り捨て | $2y$12$ |
| Symfony | 8.1.0 | ✓ | ✓ | ✓ | 先に SHA-512 | $2y$13$ |
Node.js bcrypt | 6.0.0 | ✓ | ✓ | ✗ false | ✂ 切り捨て | $2b$10$ |
Node.js bcryptjs | 3.0.3 | ✓ | ✓ | ✓ | ✂ 切り捨て | $2b$10$ |
Python bcrypt | 5.0.0 | ✓ | ✓ | ✓ | ✗ エラー | $2b$12$ |
Python bcrypt | 4.2.0 | ✓ | ✓ | ✓ | ✂ 切り捨て | $2b$12$ |
Go x/crypto/bcrypt | 0.57.0 | ✓ | ✓ | ✓ | ✗ エラー | $2a$10$ |
| Spring Security | 7.1.1 | ✓ | ✓ | ✓ | ✗ エラー | $2a$10$ |
| Spring Security | 6.5.11 | ✓ | ✓ | ✓ | ✗ エラー | $2a$10$ |
PHP 系には $2y$、Node.js には $2b$、Python・Go・Java ならどれでも構いません。プレフィックスだけを変えてもハッシュは有効なままです。
日本語パスワードと 72 バイト
bcrypt が読むのはパスワードの先頭 72 バイトだけです。ひらがな・カタカナ・漢字は UTF-8 で 1 文字 3 バイトなので、24 文字で上限に達します。次の 25 文字は 75 バイトあり、このツールは「…富士山がとてもきれいだっ」より後ろは無視されると警告します。
東京スカイツリーから見た富士山がとてもきれいだった
最後の「た」を「よ」に変えても照合結果は「一致」のままです。ライブラリーの扱いも分かれ、PHP・Laravel・Node.js は黙って切り捨て、Python bcrypt 5・Go・Spring Security 6.3 以降は生成を拒否します。全角英数字も 1 文字 3 バイトなので、IME が全角のまま入力したパスワードは見た目より早く上限に届き、半角で入れた同じ文字列とは別のパスワードになります。
コストの決め方
コストは 2 の指数で、コスト 12 は鍵の準備を 212 = 4,096 回繰り返し、11 の 2 倍の時間がかかります。OWASP Password Storage Cheat Sheet は 10 以上を求め、bcrypt は「Argon2 も scrypt も使えないレガシーシステムに限る」としています。新しく作るなら Argon2id が第一候補です。Laravel の既定値 12 は .env の BCRYPT_ROUNDS で変えられます。このページの所要時間はブラウザーの JavaScript 実装の値なので、最終的にはサーバーで測ってください。
ほかのツールとの違い
2026-10-02 に、Bing で「bcrypt ハッシュ 生成」の上位に出る MiniWebtool の日本語版を確かめたところ、パスワードはフォームでサーバーに POST されていました(リクエストに password=correct horse battery staple が含まれていました)。英語圏で上位の bcrypt-generator.com はブラウザー内で計算しますが、出力は $2a$ だけで、73 バイトのパスワードと先頭 72 バイトのハッシュを警告なしに「一致」とし、! を含むハッシュも「不一致」とだけ表示しました。このページは通信せず、プレフィックスを選べ、不一致の理由を示します。
制限
- 計算には bcryptjs 2.4.3 を使います。コスト 31 も選べますが、ブラウザーでは数日かかります。「キャンセル」でいつでも止められます。
$2x$(旧 crypt_blowfish のバグで作られたハッシュ)は、パスワードがすべて ASCII のときだけ$2a$として照合します。- 入力した文字をそのまま UTF-8 にし、Unicode の正規化はしません。
- bcrypt 専用です。Argon2・scrypt・SHA-crypt などは名前を表示するだけで照合しません。Apache や Nginx 用のファイルは htpasswd 生成ツール、ランダムなパスワードはパスワードジェネレーターで作れます。
FAQ
Laravel で使うハッシュはどのプレフィックスにすればよいですか?
$2y$ にしてください。Laravel の Hash::make() 自体が $2y$ を出力し、Hash::check() は HASH_VERIFY が既定の true のままだと $2a$ と $2b$ のハッシュで例外を投げます。ほかのシステムから移したハッシュは、接頭辞を $2y$ に変えるだけで照合できます。
bcrypt のハッシュから元のパスワードに戻せますか?
戻せません。bcrypt は一方向のハッシュで、検証は同じソルトとコストで入力をもう一度計算して比べているだけです。忘れたパスワードは、新しいハッシュを作って保存し直すしかありません。
日本語のパスワードは何文字まで使えますか?
bcrypt が読むのは先頭 72 バイトで、ひらがな・カタカナ・漢字は UTF-8 で 1 文字 3 バイトなので、24 文字までです。25 文字目以降は結果に影響しません。全角英数字も 1 文字 3 バイトです。
コストはいくつにすべきですか?
OWASP は 10 以上を求めています。Laravel・PHP 8.4・Python は既定 12、Node.js の bcrypt・Go・Spring Security は 10 です。ログインを処理するサーバーで実測し、1 秒を十分に下回る範囲で最大の値を選んでください。
パスワードはどこかに送られますか?
送られません。計算はこのタブの Web Worker で行い、パスワードもハッシュも送信・保存しません。このページはアクセス解析も広告も読み込みません。