Bcryptジェネレーター
ランダムな16バイトのソルトと、4から12までのコスト係数を使ってbcryptパスワードハッシュを作成します。このツールは$2a$で始まる標準のモジュラー暗号文字列を返します。これはPHP password_verify、Node.js bcrypt、Spring Security、ほとんどのフレームワークで受け入れられます。テストユーザーの作成、データベース内の管理者パスワードのリセット、独自のハッシュ処理コードの確認に使えます。パスワードは表示も保存もされません。
よくある質問
bcryptとは何ですか?
bcryptは、Blowfish暗号に基づく1999のパスワードハッシュ関数です。ランダムなソルトと調整可能なコストを組み合わせるため、コストを1段階上げるごとに、攻撃者が1回の推測に必要とする作業量が2倍になります。パスワード保存用として、今も広くサポートされています。
出力文字列は何を意味しますか?
$2a$10$に53文字が続くハッシュには、バージョン2a、コスト10、22文字のソルト、31文字のハッシュが含まれ、すべてbcrypt独自のBase64アルファベットで表されます。検証時にソルトとコストを読み取るため、文字列全体を保存してください。
どのコスト係数を選べばよいですか?
このツールではコストを4から12まで設定でき、一般的なフレームワークの初期値である10をデフォルトで使用します。1段階上げるごとに処理時間は2倍になるため、コスト12では10の約4倍かかります。本番環境では、サーバーが100~250ミリ秒程度で処理できる範囲で、最も高いコストを選んでください。
コストが12までなのはなぜですか?
コストが高いとハッシュ1件の計算に数秒かかり、1回のリクエストがサーバーを長時間占有する可能性があります。コスト12でもほとんどのアプリケーションには十分強く、必要であればご自身の環境でより高いコストを使って再ハッシュできます。
同じパスワードなのにハッシュが毎回異なるのはなぜですか?
ハッシュを作成するたびに、ランダムな16バイトのソルトが生成されます。ソルトが異なれば文字列も異なりますが、どの文字列も同じパスワードで検証できます。これにより、攻撃者が事前計算済みのテーブルを使うのを防ぎます。
パスワードの長さに上限はありますか?
はい。bcryptが使用するのはパスワードの先頭72バイトのみです。そのため、残りが黙って無視されないよう、72バイトを超えるパスワードは拒否します。UTF-8では、ASCII以外の文字は1文字あたり数バイトを使います。
PHPやLaravelで$2a$ハッシュを受け入れられますか?
はい。PHP password_verify、Laravel、Symfony、およびpassword_hashを使うWordPressのプラグインは、$2a$、$2b$、$2y$のハッシュを受け入れます。これらの違いは、過去のバグ修正だけです。Node.js bcrypt、bcryptjs、Python bcrypt、Spring Securityも$2a$を受け入れます。
パスワードは保存または記録されますか?
いいえ。パスワードはリクエスト中のハッシュ計算にのみ使用されます。レスポンスから削除され、ログやストレージに書き込まれることはありません。
bcryptとArgon2のどちらを使うべきですか?
OWASPは、メモリを多く必要としGPU攻撃のコストを高めるArgon2idを新しい推奨方式としています。bcryptも引き続き許容されており、幅広いライブラリでサポートされているため、Argon2が利用できない場合には妥当な選択肢です。
bcryptハッシュに対してパスワードを確認するには?
このサイトのBcrypt Verifierを使うか、フレームワークのverify関数を呼び出してください。bcrypt文字列を直接比較してはいけません。同じパスワードでも、新しいハッシュは必ず異なる文字列になるためです。