パスワードを bcrypt または Argon2 でハッシュ化、または保存済みハッシュと照合
このパスワードハッシュ生成ツールは、bcrypt ハッシュ(<code>$2b$</code>、コスト 4〜15)と、標準の PHC 文字列形式の Argon2id・Argon2i・Argon2d ハッシュを作成します。メモリ、反復回数、並列度、ソルト長、出力長は自由に設定できます。<strong>照合</strong>に切り替えると、データベースのハッシュを貼り付けてプレフィックスからアルゴリズムとパラメータを判別し、パスワードが一致するかを確認できます。ハッシュごとに新しいランダムなソルトを使い、お使いの端末でかかった時間も表示します。ハッシュ化はブラウザ内の WebAssembly で実行され、パスワードがアップロードされることはありません。
bcrypt・Argon2 ハッシュの作り方
- 1ハッシュを選び、アルゴリズムを選択します。新しいシステムなら Argon2id、既存システムに合わせるなら bcrypt です。
- 2コストを設定します。bcrypt ならコスト係数、Argon2 なら OWASP 19 MiB, t=2 などのプリセットです。既存の設定に合わせる必要があれば、メモリ・反復回数・並列度を手動で調整します。
- 3パスワードを入力し、ハッシュ化を押します。エンコードされたハッシュ、その構成要素、かかった時間が下に表示されます。
- 4ハッシュを確認するには照合を選び、保存済みハッシュとパスワードを貼り付けて照合を押します。
パスワードに遅いハッシュが必要な理由
SHA-256 のような高速ハッシュはパスワードには不向きです。GPU 1 枚で毎秒数十億回の SHA-256 を計算できるため、漏えいした SHA-256 のパスワードハッシュはその速度で推測されてしまいます。パスワードハッシュ関数はわざと遅く、Argon2 の場合は大量のメモリを必要とするよう設計されており、推測 1 回ごとに実際の時間とハードウェアを消費させます。サーバーで 0.25 秒かかる設定なら、攻撃者もユーザー 1 人・推測 1 回ごとに同じ 0.25 秒を払うことになります。
各ハッシュには固有のランダムなソルトも含まれるため、同じパスワードを使う 2 人のユーザーでもハッシュは異なり、事前計算テーブルは役に立ちません。ソルトとすべてのパラメータはハッシュ文字列の中に保存されるので、ライブラリはハッシュだけでパスワードを照合できます。
bcrypt ハッシュの読み方
$2b$12$R9h/cIPz0gi.URNNX3kh2OPST9/PgBkqquzi.Ss7KIUgO2t0jWMUW のような bcrypt ハッシュは 4 つの部分からなります。バージョン 2b、コスト 12(212 = 4,096 回の鍵拡張)、22 文字のソルト、31 文字のハッシュで、後の 2 つは bcrypt 独自の Base64 アルファベットで表されます。コストを 1 上げるごとに時間は 2 倍になります。
$2a$、$2b$、$2y$ は 72 バイトまでのパスワードなら同じ結果になります。文字の違いは古い実装のバグ修正を表しています。bcrypt はパスワードの先頭 72 バイトしか読まず残りを無視するため、このツールは警告を表示します。長いパスフレーズや、1 文字が 2〜4 バイトになる日本語などの非ラテン文字では、思ったより早くこの上限に達します。
Argon2id・Argon2i・Argon2d
PHC 文字列には照合に必要な情報がすべて含まれます。$argon2id$v=19$m=19456,t=2,p=1$<salt>$<hash> はバージョン 1.3、メモリ 19,456 KiB、2 パス、1 レーンを意味し、その後にパディングなし Base64 のソルトとハッシュが続きます。
- Argon2id
- 下の 2 つを組み合わせたハイブリッド型で、RFC 9106 と OWASP がパスワード保存に推奨するバリアントです。特別な理由がない限りこれを使います。
- Argon2i
- メモリアクセスがパスワードに依存しないため、サイドチャネル攻撃に強い一方、パス数が少ないと GPU による解析に弱くなります。
- Argon2d
- メモリアクセスがパスワードに依存します。GPU には最も強いものの、サイドチャネルには弱い方式です。プルーフ・オブ・ワーク向けで、ログインを検証するサーバーには向きません。
推奨設定
- Argon2id:OWASP はメモリ 19 MiB・反復 2 回・並列度 1、または 47 MiB・反復 1 回や 12 MiB・反復 3 回などの同等の組み合わせを推奨しています。RFC 9106 はメモリに余裕があれば 64 MiB・反復 3 回・4 レーンを提案しています。
- bcrypt:コストは 10 以上。現在は 12 が一般的な既定値です。ログインエンドポイントが耐えられる最大のコストを選びましょう。サーバーで 1 ハッシュあたり約 250 ms が妥当な目安です。
- ソルト:ランダムな 16 バイト。ハッシュ長:32 バイトあれば十分です。
- ここで計測される時間はお使いの端末上の WebAssembly での値で、通常はサーバー上のネイティブライブラリより遅くなります。コストを決める前に本番環境のハードウェアでベンチマークしてください。
このツールの使いどころ
シードユーザーや設定ファイル用のハッシュを作るとき、データベースのハッシュが想定どおりのパスワードと本当に一致するか確かめるとき、既存のハッシュがどのパラメータで作られたかを調べるときに使えます。アプリケーションは登録時に自前のライブラリでパスワードをハッシュ化すべきで、平文のパスワードをウェブサイトに送ってハッシュ化してはいけません。ハッシュ化する強力なパスワードを作るにはパスワード生成ツールを、パスワード保存ではなく鍵付き署名が目的ならHMAC 生成ツールをご覧ください。
よくある質問
- bcrypt と Argon2 のどちらを使うべきですか?
- 新しいシステムなら Argon2id です。Password Hashing Competition の優勝アルゴリズムで、メモリハードなため GPU や ASIC による解析のコストが大幅に上がります。bcrypt も依然として許容範囲で非常に広くサポートされているので、すでに使っているならそのままで構いません。
- 同じパスワードなのに毎回ハッシュが変わるのはなぜですか?
- ハッシュごとに新しいランダムなソルトを使うため、出力は毎回変わります。これは意図した動作です。パスワードを確認するときは、新たに生成した 2 つのハッシュを比べるのではなく、保存済みハッシュと照合してください。
- bcrypt や Argon2 のハッシュは復号できますか?
- できません。どちらも一方向関数です。パスワードを見つける唯一の方法は候補を推測して 1 つずつハッシュ化することで、これらのアルゴリズムはそれを意図的に遅くしています。
- bcrypt の 72 バイト制限とは何ですか?
- bcrypt はパスワードの先頭 72 バイトしか使いません。それ以降はハッシュに影響しないため、先頭 72 バイトが同じ 2 つの長いパスワードは一致するハッシュになります。Argon2 にはこの制限はありません。
- bcrypt のコスト係数はいくつにすべきですか?
- 最低 10 で、12 が一般的な既定値です。1 増やすごとに処理量は 2 倍になります。サーバーでのログインが十分速く保てる範囲で最大の値を選んでください。
- $2a$、$2b$、$2y$ の bcrypt ハッシュに互換性はありますか?
- はい。72 バイトまでのパスワードなら同じハッシュになります。ほとんどのライブラリは 3 つのプレフィックスすべてを受け付け、このツールもすべて照合できます。
- 照合にハッシュ化と同じくらい時間がかかるのはなぜですか?
- 照合とは、ハッシュに保存されたソルトとパラメータでパスワードを再度ハッシュ化し、結果を比較することなので、まったく同じ処理量がかかります。それが推測を高コストにしているのです。
- パスワードはサーバーに送信されますか?
- いいえ。bcrypt と Argon2 はブラウザ内の WebAssembly で実行されます。入力した内容がページの外に出ることはありません。