パスワードハッシュ生成・検証(Argon2id/bcrypt)

Argon2id・Argon2i・Argon2d・bcrypt・scrypt・PBKDF2でパスワードハッシュをブラウザ内で生成できるツールです。メモリ量・反復回数・コストなどのパラメータやソルトを指定でき、Argon2のPHC文字列やbcryptのハッシュがパスワードと一致するかの検証もできます。

パスワードやソルトはこのブラウザ内(Web Worker)だけで計算され、サーバーには送信されません。ページやコードの読み込みには通信が発生します。
アルゴリズム

Password Hashing Competition優勝の現行推奨方式。新規システムではArgon2idを推奨します。

通常はランダムな16バイト以上の値を使います。既存のハッシュを再現したいときは同じソルトを入力してください。

パラメータ
種類

19.0 MBのメモリを使います。

初期値はOWASP Password Storage Cheat Sheetの推奨値です。値を大きくするほど安全になりますが、計算に時間がかかります。

パラメータを指定して「ハッシュを生成」を押すと、ここに結果が表示されます。

使い方

  1. 「ハッシュ生成」タブでアルゴリズム(Argon2・bcrypt・scrypt・PBKDF2)を選びます。
  2. パスワードを入力します。ソルトは自動でランダムに生成されますが、既存のハッシュを再現したい場合は16進数またはテキストで指定できます。
  3. 必要に応じてメモリ量・反復回数・並列度・コストなどのパラメータを調整し、「ハッシュを生成」を押します。初期値はOWASPの推奨値です。
  4. Argon2・bcryptはそのまま保存できるエンコード済み文字列、scrypt・PBKDF2は16進数・Base64のハッシュが表示され、コピーできます。
  5. 「ハッシュ検証」タブにハッシュ文字列とパスワードを入力して「照合する」を押すと、一致するかどうかを判定できます。

このツールについて

パスワードハッシュ生成・検証ツールは、パスワードの保存に使う「遅いハッシュ関数(鍵導出関数)」をブラウザ内で計算できるツールです。SHA-256のような高速なハッシュは総当たり攻撃に弱いため、パスワードの保存には計算コストを調整できるArgon2id・bcrypt・scrypt・PBKDF2を使うのが一般的です。

Argon2idはPassword Hashing Competitionの優勝方式で、OWASPが最初に推奨しているアルゴリズムです。生成結果は $argon2id$v=19$m=19456,t=2,p=1$<ソルト>$<ハッシュ> というPHC文字列形式で出力され、各言語のArgon2ライブラリでそのまま検証できます。bcryptは $2a$<コスト>$... 形式で出力され、PHPの $2y$ 形式の検証にも対応しています。

計算はWeb Worker上のWebAssembly実装(hash-wasm)とWeb Crypto APIで行うため、重いパラメータでも画面が固まらず、途中で中止することもできます。入力したパスワードやソルトがサーバーに送信されることはありません。

再現用にはPBKDF2、SHA-256、パスワード「password」、テキストのソルト「salt」、反復1回、出力32バイトを指定します。16進数の結果は 120fb6cffcf8b32c43e7225256c4f837a86548c92ccc35480805987cb70be17b です。この低い反復回数は動作確認専用です。

別の実装との照合では、ソルトの文字列表現と実際のバイト列を混同しないことが大切です。テキストの「6162」と16進数の「6162」は異なるソルトになります。方式だけでなく、文字コード・反復回数・出力長もそろえて比較してください。

よくある質問

どのアルゴリズムとパラメータを使えばよいですか?

新規システムではArgon2id(メモリ19MiB・反復2回・並列度1以上)が推奨されます。Argon2が使えない環境ではscrypt(N=2^17・r=8・p=1)、既存システムとの互換性が必要ならbcrypt(コスト10以上)、FIPS準拠が必要ならPBKDF2-HMAC-SHA256(600,000回以上)を選びます。本ツールの初期値はこれらのOWASP推奨値です。

同じパスワードでも生成するたびに結果が変わるのはなぜですか?

ソルト(ランダムな値)が毎回変わるためです。ソルトによって同じパスワードでも異なるハッシュになり、事前計算した表を使った攻撃を防げます。同じ結果を得たい場合は、同じソルトとパラメータを指定してください。

bcryptで長いパスワードがエラーになります。

bcryptは仕様上、パスワードの先頭72バイトまでしか扱えません。日本語などのマルチバイト文字は1文字あたり3バイト程度になるため注意してください。長いパスワードを扱う場合はArgon2idを使うことをおすすめします。

入力したパスワードはサーバーに送信されますか?

送信されません。ハッシュの生成・検証はすべてブラウザ内のWeb WorkerとWeb Crypto APIで実行されます。