パスワードハッシュ生成・検証

bcrypt、scrypt、Argon2id、PBKDF2 でパスワードをハッシュ・検証します。完全にブラウザー内 — PHC 形式の文字列を生成し、候補パスワードを既存ハッシュに対してチェックし、その中に隠れたパラメーターを調査できます。アップロードは一切ありません。
テストパスワード専用です。実際のユーザーのパスワードをどんな Web ページにも貼り付けてはいけません。このツールは完全にブラウザー内で動き — 文字列がタブから出ることはありません — しかし実際の漏洩は 1 回の貼り付けから始まります。
bcrypt コスト(2^cost ラウンド)
bcrypt 変種 変種は接頭辞だけを変えます。ハッシュ自体は同一です
scrypt N(CPU コスト)
scrypt r / p r = p = ブロックサイズ 128·r バイト。メモリ = 128·N·r バイト(N=214、r=8 → 16 MiB)
Argon2id m(メモリ)
Argon2id t / p t = p = t = パス数。p = 並列度(レーン)
PBKDF2 PRF
PBKDF2 反復回数 OWASP 2023:HMAC-SHA-256 で 600,000(SHA-1 で 1,300,000、SHA-384/512 で 210,000)
出力長(バイト) bcrypt の出力は固定 23 バイト(bcrypt-base64 で 31 文字)です
アルゴリズムパラメーターメモリ出力長時間(このブラウザー)
bcryptコスト 124 KiB23 バイト-
scryptN=214, r=8, p=116 MiB32 バイト-
Argon2idm=19 MiB、t=2、p=119 MiB32 バイト-
PBKDF2HMAC-SHA-256、600,000 反復~032 バイト-
パラメーターチートシート(OWASP Password Storage Cheat Sheet、2023 最小値)
アルゴリズム最小値備考
Argon2idm = 19 MiB(19,456 KiB)、t = 2、p = 1推奨。メモリ困難
scryptN = 214, r = 8, p = 1メモリ困難(最小値で 16 MiB)
bcryptコスト = 10作業係数のみ。72 バイトパスワード上限
PBKDF2-HMAC-SHA256600,000 反復反復困難のみ — GPU に好都合。最後の選択
このページの既定値はすべての最小値以上です。本番ではまず Argon2id を、利用できない場合は scrypt または bcrypt を、PBKDF2 は FIPS 適合の理由がある場合のみ選んでください。
PHP 相互運用 — password_hash($pw, PASSWORD_BCRYPT) は $2y$10$... を出力します:候補パスワードと一緒に検証へ貼り付けると、このページは password_verify() とまったく同じ答えを返します。PASSWORD_ARGON2ID の出力($argon2id$v=19$m=65536,t=4,p=1$...)も検証できます。passlib、django-argon2、crypto.scrypt ラッパーの PHC 文字列も解析します。
セルフテスト
公開ベクトルに対してページのエンジンを再実行します:bcrypt の crypt_blowfish テストスイート、node/OpenSSL が生成した scrypt と Argon2id の文字列、RFC 6070 の PBKDF2 ベクトルと公開 SHA-256 セット、さらに全アルゴリズムの生成→検証ラウンドトリップと陰性テスト(間違ったパスワードは失敗、不正な文字列は拒否されなければならない)。どこにも送信されません。
パスワードハッシュをゼロから解説
一言で言えば:パスワードハッシュは意図的に遅く(できればメモリ食いに)設計されています。データベースを盗まれても攻撃者が毎秒数十億の推測を試せないようにするためです — 速度のために作られた SHA-256 のような高速ハッシュの正反対の目標です。
なぜパスワードを単に SHA-256 してはいけないのか?

最新の GPU 上の SHA-256 は毎秒数十億の推測で走ります。8 文字のパスワードの組み合わせは 1013 に遠く及ばず — GPU 数時間、大型マシンなら数分です。パスワードハッシュ関数(KDF)はコストパラメーターでこれに立ち向かいます:bcrypt はコアを 2cost 回繰り返し、PBKDF2 は HMAC を数十万回反復し、scrypt と Argon2id はさらに推測ごとにメガバイト級のメモリを要求するため、(高速だがコアあたりのメモリが乏しい)GPU は優位を失います。ソルト — ランダムで、ハッシュ文字列の中に平文のまま保存される — は事前計算されたレインボーテーブルを止め、推測ごとにユーザーごとの新鮮な計算を強制します。

このページの 4 つのアルゴリズム
アルゴリズム年困難さ文字列形式注意点
bcrypt1999CPU(2cost 回の鍵セットアップ)$2b$12$ + 22 文字ソルト + 31 文字ハッシュ72 バイトパスワード上限(72 を超えた分は黙って無視される)。元の C 実装では NUL バイトがパスワードを終わらせる
PBKDF22000(RFC 2898/8018)CPU(反復)$pbkdf2-sha256$i=600000$ + ソルト + ハッシュ(passlib 式)メモリコストなし — GPU と ASIC が好む。調整できるのは反復回数だけ
scrypt2009(RFC 7914)CPU + メモリ(128·N·r バイト)$scrypt$ln=14,r=8,p=1$ + ソルト + ハッシュN は 2 のべきでなければならない。メモリは r に比例して増える
Argon2id2015(PHC 優勝、RFC 9106)CPU + メモリ(m KiB、t パス)$argon2id$v=19$m=19456,t=2,p=1$ + ソルト + ハッシュArgon2i(データ非依存)対 Argon2d(データ依存)対 Argon2id(ハイブリッド)— 理由がなければ常に id を選んでください
メモリ困難性と計算困難性

GPU は数千のコアを持ちますが、各コアが触れる高速メモリはわずかです。1 回の推測に 19 MiB の作業セットを必要とする KDF は、攻撃者を「19 MiB のメモリ塊の数」までしか並列推測できなくします — だからこそ 19 MiB の Argon2id は、ノート PC 上の実時間では bcrypt コスト 15 より短くても、実務ではより強くなれるのです。PBKDF2 にはこの問いへの答えがありません:つまみは反復回数だけで、シリコンはそれを線形にスケールさせます。

PHC 文字列の読み方

modular-crypt / PHC 形式は自己記述型です:$argon2id$v=19$m=19456,t=2,p=1$ICEiIyQlJicoKSorLC0uLw$WTGpK4hf... の各項目はアルゴリズム、バージョン、パラメーター(m = KiB 単位のメモリ、t = パス数、p = レーン)、base64 ソルト、base64 ハッシュです。bcrypt は標準より古く、独自のコンパクト形式を使います:$2b$ 変種、12 コスト、その後 bcrypt 独自の base64 アルファベット(./A-Za-z0-9)のソルトとハッシュ。このページの検証はこれらすべてを受け付け、解析した項目を表示します — 見つけたハッシュを貼り付けて、何に分解されるか確かめてください。

よくある間違い
  • パスワードに高速ハッシュ。MD5/SHA-1/SHA-256 のパスワード列は、汎用 GPU で毎秒数十億の推測に落ちます。ファイルとデータにはハッシュジェネレーターを、パスワードにはこのページのアルゴリズムを。
  • ソルトの共有。全ユーザーで 1 つのソルトでは、等しいパスワードが等しいハッシュになり、レインボーテーブルが復活します。ここのハッシュは毎回新鮮な 16 バイトのランダムソルトを受け取ります。
  • bcrypt の 72 バイトを無視する。"a"*100 と "a"*72 は同一にハッシュされます — 尾は切り捨てられます。このページはパスワードが 72 バイトを超えると入力ボックスで警告します。Argon2 にそのような上限はありません。
  • 自分のコードで == によるハッシュ比較。検証は定数時間でなければなりません。ページのエンジンは内部でそれを行います(再計算して保存されたバイトと比較します)が、このやり方を真似るなら定数時間比較を使ってください。
  • 高速な開発機でパラメーターを調整する。目標はあなたのワークステーションではなく、本番ユーザーの中央ハードウェアで約 250〜500 ms のハッシュ時間です。ベンチマークボタンはこのブラウザーが実際に経験する値を表示します。
  • ログインチェックごとの再ハッシュ。まず検証し、検証が成功した後にだけ(コストを上げるなど)再ハッシュして新しい文字列を保存します。PHP の password_needs_rehash() はまさにこのための関数です。
よくある質問

どれを選ぶべき?OWASP 最小値以上の Argon2id です。ランタイムが提供しないなら scrypt、その次に bcrypt(ハッシュに 250 ms 以上かかるコスト)。PBKDF2 は認証要件が求める場合だけ。

なぜランダムソルトが出力文字列に表示されるのですか?ソルトは秘密ではありません — 検証に必要なのが文字列と候補パスワードだけで済むよう、意図的に PHC 文字列内に平文で保存されます。その役割は秘密性ではなく一意性です。

変種($2a$ / $2b$ / $2y$)は重要ですか?ASCII パスワードでは同一のハッシュを生成します。$2a$ は 1990 年代の元型、$2b$ は珍しい符号拡張バグの修正(2014 年)、$2y$ は修正が入っていることの PHP の印です。検証は 3 つすべてを受け付けます。

ハッシュにどのくらい時間がかかるべき?サーバーハードウェアでログインあたり約 250〜500 ms です。100 ms 未満だとオフライン解析が安くなり、1 秒超だとセキュリティが改善される前にユーザーが文句を言います。

他の場所で生成されたハッシュを検証できますか?はい — 貼り付けて候補パスワードを与えてください。既知の正常形式:PHP の password_hash(bcrypt $2y$ と Argon2id)、Python passlib、django の argon2 ハッシャー、Tarsnap の scrypt ツールが使う scrypt 文字列形式。

「ベンチマーク」ボタンは何をするのですか?現在のパスワードをページ既定パラメーターで各アルゴリズムに 1 回ずつハッシュさせ、このブラウザーでの実時間を報告します — コスト差の感覚であり、厳密な測定ではありません。