初めてログインシステムを出荷したとき、私はその時代のすべてのチュートリアルが私に指示したことをしました: 保存されました md5($password) ユーザーテーブルで移動しました。 それは動作し、静かに災害でした。 authをWordPressプラグインとLaravelアプリに何年も構築した後、私は" の間のギャップをより健全に尊重しています。 パスワードチェックがパス" と " このデータベースが漏れた場合のパスワードは安全です。 " Bcryptはそのギャップの大部分を閉じるツールであり、私が到達するほとんどすべてのフレームワークのデフォルトで、私はを構築しました bcrypt ジェネレータ で Toolz.dev これは、あなたが制御するコスト要因でパスワードをハッシュし、既存のハッシュに対してパスワードを検証し、あなたが入力したものがどこにも送信されないように、ブラウザですべてを実行します。これは、それと bcrypt 自体のガイドです。
tl;dr: Bcryptは、パスワードを塩漬けにして、意図的に遅い60 文字のハッシュに変えて、漏洩したデータベースが漏洩したパスワードリストにならないようにします。 ツールズ bcrypt ジェネレータ 調整可能なコスト係数 (4 から 31) で任意のパスワードをハッシュし、貼り付けたハッシュに対してパスワードを検証し、解析したバージョン、コスト、およびソルトを表示します。標準を生成します
$2b$その形式 OpenBSD, PHPpassword_hash、laravel、node bcrypt ライブラリはすべて受け入れ、完全にクライアント側で実行されます。
Bcryptとは?
Bcrypt は、Niels Provos と David Mazieres によって設計され、1999 年の USENIX 論文で発表されたパスワード ハッシング関数です "A Future-Adaptable Password Scheme"。 blowfish ブロック暗号の上に構築されていますが、ひねりを加えています。データを暗号化する代わりに、パスワードとランダムなソルトをキー マテリアルとして使用して、Blowfish's キー セットアップ ステップを何度も実行します。その結果、一方向ハッシュは、一回計算すると安価で、10 億回計算すると高価になります。これはまさにプロパティ パスワード ストレージのニーズです。
その " expensive on purpose" idea is the heart of it. SHA-256 のような汎用ハッシュは高速になるように設計されています、なぜならチェックサムと整合性チェックは速度を求めているからです パスワードハッシュは逆のことを望んでいます 攻撃者がデータベースを盗んだ場合、それらとすべての平文パスワードの間に立っているのは、推測にどれくらいの時間がかかるかだけです 高速ハッシュにより、最新の GPU は毎秒数十億の候補をテストできます; 賢明なコスト上限での bcrypt ハッシュは、コアごとに数千の同じ漏洩ファイル、大きく異なる結果をもたらします。
Bcryptは20 年以上も生き残ってきましたなぜなら基本を正しく理解したからです適応性があるからですコストファクターは1999 年のハードウェアに合わせて調整した同じアルゴリズムを2026 年のハードウェアでも他に何も変更せずにダイヤルアップできるということですが推奨オプションのままです OWASP パスワード ストレージ チート シート、そしてそれは、Laravel、Spring Security、および私が働いている他の多くのスタックで既成概念にとらわれないデフォルトです。 高速ハッシュがこのジョブに間違っている理由についてのより深い背景が必要な場合は、 データプライバシー オンラインツール このガイドでは、業界全体をゆっくりと塩漬けのハッシュ化へと推し進めた推論について説明します。
Bcryptハッシュには何が含まれていますか?
bcryptの最も良い点の1 つは、その出力が自己記述的であることです。 リアルハッシュを取る:
$2b$12$R9h/cIPz0gi.URNNX3kh2OPST9/PgBkqquzi.Ss7KIUgO2t0jWMUW
左から右に読み、ドル記号を分割すると、それに対してパスワードを確認するために必要なすべてが表示されます:
| フィールド | 例 | 意味 |
|---|---|---|
| バージョン | 2b |
Bcrypt の亜種. 2b は、現在の修正済み OpenBSD 形式です |
| 費用 | 12 |
作業係数。 key-setup は 2^12 = 4096 回の反復を実行します |
| 塩 | R9h/cIPz0gi.URNNX3kh2O |
カスタムBase64の22 文字、16 ランダムバイトにデコード |
| ダイジェスト | PST9/PgBkqquzi.Ss7KIUgO2t0jWMUW |
23 バイトの bcrypt 出力をエンコードする 31 文字 |
文字列の内側にソルトとコストライブがあるため、検証には他に何も必要ありません。 にハッシュを貼り付けると、 bcrypt ジェネレータ verify モードでは、コストとソルトを文字列から直接読み取り、その正確なソルトを使用してダイジェストを再計算し、比較します。管理すべき個別のソルト列がありません。これが、bcrypt が保存するのが非常に楽しい理由の 1 つです。これは、ユーザー テーブル内の単一の不透明なフィールドです。
カスタムBase64 アルファベットは、人をつまずかせるので、注目に値します。 Bcryptは使用します ./A-Za-z0-9、標準の Base64 とは順序が異なる。 bcrypt ソルトは標準の Base64 文字列ではないので、汎用的な Base64 ツールでデコードしようとしてはならず、意味のあるバイトを期待してください。 他の場所で使用されている標準バリアントに興味がある場合は、 base64 エンコーディング ガイドは通常のアルファベットとそれが現れる場所を歩きます。
Bcryptハッシュを生成するにはどうすればよいですか?
ツールでは、3 つのステップです: パスワードを入力し、コストを選択し、生成をクリックします。 フードの下で、ハッシュを生成すると、見た目以上の効果が得られます。 まず、Web Crypto API を使用して、暗号的に強力な 16 バイトのランダム ソルトが作成されます。次に、bcrypt は高価なキー スケジュールを実行し、パスワードとソルトで Blowfish をシードし、2^cost 回を繰り返します。最後に、固定されたマジック文字列 ("OrpheanBeholderScryDoubt") を 64 回暗号化し、結果として得られる暗号状態と Base64 で出力をエンコードします。ダンス全体が 60 文字のハッシュを生成します。
最も一般的な驚きは、同じパスワードを2 回ハッシュすると、2 つの異なるハッシュが得られることです。 それは正しく、意図的です。 各ハッシュは独自のランダムなソルトを取得するため、両方を選択する2 人のユーザー hunter2 格納されている値がまったく異なる状態になってしまいます テーブルを盗んだ攻撃者は、2 つのアカウントがパスワードを共有していることを知ることができず、事前に計算されたテーブルをアカウント間で再テストするために特定のハッシュを再現したい場合は、ベアリコストではなく完全なソルト文字列を供給します。これはまさに検証モードが内部で行うことです。
アプリケーションコードでは、このいずれかを手で組み立てることはありません あなたはライブラリを呼び出します:
// PHP
$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
// Node with bcrypt / bcryptjs
const hash = await bcrypt.hash(password, 12)
// Laravel
use Illuminate\Support\Facades\Hash;
$hash = Hash::make($password); // bcrypt by default
Toolz ツールは、そのコードの周りの瞬間を対象としています。サニティ - 特定のコストでハッシュがどのように見えるかをチェックする、シーダーまたはテスト フィクスチャの既知のハッシュを生成する、または構成で見つけたハッシュがパスワードと一致することを確認する。そうだと思います。
コストファクターを選択するにはどうすればよいですか?
コスト要因は、あなたが考えなければならない1 つのノブであり、正直な答えは、 " measure、コピーしないでください." OWASPからの経験則は、単一のハッシュは、あなたの生産ハードウェア上のどこか4 分の1 秒の反対の力のバランスを取ることです: 低すぎるし、あなたはクラッキングを安く、高すぎると、すべての正当なログインが価格を支払う、ビジーエンドポイントがすべての要求にハッシュしているときに重要です。
コストが2 の累乗であるため、各ステップは作業を2 倍にします コスト11 はコスト10 の2 倍、コスト12 は4 倍遅くなります 一般的な2020 年代のサーバーハードウェアでは、コスト10 から12 は右近傍に着地するため、フレームワークがデフォルトでそこに配置されているツールは、スライダーをドラッグすると、コスト複合がどれだけ早く感じられるように、大まかな時間推定値を示しますが、それをサーバーのベンチマークではなく相対的なガイドとして扱います 実数はCPUに依存し、それを知る唯一の方法は時間です password_hash それを実行するボックスに.
知る価値のある1 つの実用的なパターン: コストはすべてのハッシュの内部に保存されているため、移行せずに時間をかけて上げることができます ログインが成功すると、しばらく平文を手に持っているため、保存されているハッシュ& #39; s コストが現在の目標を下回っているかどうかを確認し、そうであれば、再ハッシュして更新します。 PHPはこれを直接的に公開します password_needs_rehash。つまり、パスワードのリセットを強制することなく、セキュリティがハードウェアと歩調を合わせていることを意味します。
Bcrypt 対 SHA-256、Argon2、および scrypt
最も重要な比較は、プレーンな高速ハッシュに対してbcryptであり、新しいメモリハード関数に対してです。 パスワードストレージ用にどのように並ぶかは次のとおりです:
| 機能 | 塩漬け | 故意に遅い | 記憶困難 | パスワードに良い? |
|---|---|---|---|---|
| MD5 / SHA-256 | いいえ(それ自体で) | いやー | いやー | いや、速すぎる |
| bcrypt | はい、組み込まれています | はい、調整可能なコストです | いやー | はい、お勧めします |
| スクリプト | はいって | はいって | はいって | はいって |
| Argon2id | はいって | はいって | はいって | はい、新しいシステムに好まれます |
さらけ出しのSHA-256 のパスワードは、塩漬けでさえ、間違ったツールです: それは速度のために設計されているので、塩漬けSHA-256 ハッシュの漏洩データベースは、GPUにすぐに落ちる、パスワードではなくチェックサムまたはキャッシュキーのための高速ダイジェストだけが必要な場合、それは何です ハッシュジェネレータ は for であり、区別が全体のポイントです。 2015 年のパスワードハッシュコンペティションの優勝者であるArgon2idはメモリの硬度を追加し、bcryptを加速できるカスタムハードウェアに抵抗し、ランタイムを制御する真新しいシステムの最初の選択肢です。 bcryptは時代遅れではありません。バトルテスト済みで、私が毎日使用するツールのデフォルトであり、特にフレームワークが出荷するときに選択するのは健全な決定です。避けるべき間違いはありません。 " Argon2 の代わりにbcrypt、" それは" それらのいずれかの代わりに高速ハッシュです。 " ハッシュと組み合わせるセキュリティユーティリティのより広範なツアーの場合、 開発者の生産性向上ツール ガイドには地図があります.
72 バイトの制限や他のゴッチャはどうですか?
Bcryptはパスワードの最初の72 バイトしか読みません 黙って無視される過去のもの、通常のパスワードでは決して重要ではありませんが、非常に長いパスフレーズを噛むことができます、特にバイト数が文字数よりも速く上昇するマルチバイトUTF-8 文字のツールは、入力が72 UTF-8 バイトを超えるたびに警告するため、切り捨ては決して黙って驚きではありません。 bcryptに渡す前に、SHA-256 とBase64 でパスワードを事前にハッシュすることで、制限を回避するシステムもあります。 bcryptは、任意に長いパスワードを固定された短い入力に折りたたみます; これを行う場合は、サインアップとログインの両方で一貫して実行します。
もう1 つのgotchaは、バージョンプレフィックスです。 と表示されます $2a$、 $2y$、そして $2b$ 野生では. $2a$ がオリジナルであった、 $2y$ は、いくつかの実装で符号拡張のバグが見つかった後に導入された PHP 固有のタグであり、 $2b$ は、現在の修正済み OpenBSD バージョンです。 必要な新しいハッシュの場合 $2b$、このツールが生成するものはどれです。 3 つすべてが通常のASCIIパスワードに対して同一に検証します; 違いは、72 バイトの境界の近くの特定の非ASCIIバイトでのみ表面化します。 のような構造化された資格情報も検査するツールにトークンを貼り付けると JWT デコーダ、bcryptハッシュは、ペイロードを読み取るためにデコードするトークンではないことを覚えておいてください; それは明らかにするものは何もない一方通行のダイジェストです。
bcryptジェネレータが実際のワークフローに収まる場所
それ自体では、ハッシュは話の半分しかないので、ミキサーは私が開いたままにする他の資格情報ツールと並んで座ります。テストデータベースをシードしたり、デモアカウントを設定したりするときは、パスワード自体を で生成します パスワードジェネレータ、で賢明な強度バーをクリアしていることを確認してください パスワード強度チェッカー、そしてそれでのみ実行します bcrypt ジェネレータ 保存されたハッシュを取得するには。その順序は重要です。cost-12 bcrypt ハッシュの背後にある強力なランダム パスワードは真に解読が難しいですが、同じハッシュの背後にある弱いパスワードは依然として辞書攻撃に該当します。攻撃者はキースペース全体ではなく、少数の有力な候補を推測するだけで済むためです。コスト要因により時間が稼げます。パスワード エントロピーは、その時間が何に対して費やされるかです。
verify モードはデバッグ中にその場所を獲得します ログインがステージングで不思議に失敗すると、問題を分離する最速の方法は、保存されたハッシュとあなたが正しいと信じるパスワードを貼り付け、それらが一致するかどうかを確認することです 一致はバグが上流にあることを意味します パスワードがチェックに到達する方法で; ミスマッチは、保存されたハッシュが別のパスワードまたはめちゃくちゃなエンコーディングで書かれたことを意味します どちらの答えも推測を防ぎ、全体がローカルで実行されるため、そのハッシュがマシンから離れることなくデータベースから引き出された実際のハッシュを使用して行うことができます サイト上のすべてのツールの背後にあるクライアント側の原則と同じであり、資格情報に触れるものは何でもそれは素敵ではありません、それは要件です。
よくある質問
このbcryptジェネレータで実際のパスワードをハッシュしても安全ですか?
はい、ハッシュは完全にブラウザで発生し、どこにも送信されないためです。開発者ツールの「ネットワーク」タブでこれを確認できます。ハッシュを生成してもリクエストは発生しません。つまり、ブラウザ タブはパスワード マネージャーではないため、構築していない Web ページに運用アカウントのライブ資格情報を貼り付けることは避け、完了したらタブを閉じます。
なぜ同じパスワードで毎回異なるbcryptハッシュが生成されるのでしょうか?
なぜなら bcrypt はハッシュごとに新しいランダムなソルトを生成し、結果にミックスするからです これは特徴: 同じパスワードを選んだ2 人のユーザーが、異なるストアドハッシュを取得するため、攻撃者が共有パスワードを見つけたり、事前に計算されたテーブルにソルトを格納したりするため、検証は依然として機能します。
Bcryptにはどのようなコスト要因を使用すればよいですか?
ログインフローが許容できる最も高いコストを煩わしい遅延なく使用します。2020 年代のほとんどのサーバーでは、これは 10 ~ 12 ドルのコストです。OWASP は、単一のハッシュで実稼働ハードウェアで約 4 分の 1 秒かかる必要があると提案しています。各ステップで作業が 2 倍になるため、数値をコピーするのではなく独自のサーバーで測定し、ハードウェアの速度が向上するにつれて数年ごとにコストを引き上げます。
bcrypt ハッシュを逆にパスワードに戻すことができますか?
いいえ Bcryptは一方向関数なので、ハッシュを元のパスワードに戻す数学的な方法はありません 唯一の攻撃は推測です: 攻撃者は同じソルトとコストで候補のパスワードをハッシュし、一致をチェックします。 各推測の価格を設定するため、コスト係数が重要であるのはこのためです。また、強力な一意のパスワードと高いコストにより、推測が現実的ではなくなるのはなぜですか。
2026 年時点でも bcrypt は安全ですか、それとも Argon2 に切り替えるべきですか?
Bcrypt は依然としてパスワード ストレージに対して安全であると考えられており、OWASP パスワード ストレージ チート シートでは推奨オプションのままです。 2015 年のパスワード ハッシュ コンペティションの優勝者である Argon2id は、GPU や特殊なハードウェア攻撃にも耐えるため、ランタイムを制御する新しいシステムに好まれています。 Bcrypt は健全な選択であり、特にフレームワークがデフォルトとして出荷する場合、本当の間違いは、パスワード ハッシュ機能の代わりに高速な汎用ハッシュを使用することです。
Bcryptの72 バイト限界とは何ですか?
BcryptはUTF-8 でエンコードされたパスワードの最初の72 バイトしか読み取らないため、それ以降の文字は無視されます 通常のパスワードではこれは決して問題ではありませんが、非常に長いパスフレーズは切り捨てられるため、一部のシステムではbcryptの前にSHA-256 でパスワードを事前にハッシュし、入力が72 バイトを超えるとこのツールは警告するため、切り捨ては決して驚くべきことではありません。
$2a$、$2b$、$2y$ の接頭辞の意味は?
これらは bcrypt 出力形式のバージョン タグです。 $2a$ はオリジナル、$2y$ は符号拡張バグに対する PHP 固有の修正、$2b$ は現在の修正された OpenBSD バージョンです。新しいハッシュの場合 $2b$ は正しいです。これはこのツールが生成するものです。 3 つはすべて ASCII パスワードに対して同一に検証します。 72 バイトの境界にある特定の非 ASCII バイトでのみ差分が表示されます。
Bcryptは暗号化と同じですか?
いいえ 暗号化はキーで可逆的であるため、暗号化されたデータは元のデータに復号化できます。 Bcryptハッシュは一方通行で意図的に遅く、検証のみを目的としています: パスワードを回復する必要はなく、誰かが正しいものを入力したことを確認するためだけです。キーを保持している人がすべてのパスワードを回復できるため、ハッシュではなく暗号化を使用してパスワードを保存することはアンチパターンです。



