bcrypt vs Argon2 vs scrypt

更新日:

ユーザーパスワードを生 SHA-256 で保存するのは既知の誤りです。SHA-256 は速すぎ、ハッシュ DB が漏洩すれば市販 GPU で毎秒数十億回の総当たりが可能です。業界の答えがパスワード専用ハッシュ関数群で、bcrypt(1999)・scrypt(2009)・Argon2(2015)が三本柱です。意図的に遅く、メモリ要件も大きくして総当たりを高コスト化します。本ガイドでは、設計目標・攻撃耐性・実運用での選定材料を比較します。

パスワードハッシュが汎用ハッシュと違う理由

SHA-256 は「速い」ように設計されています。その速さがパスワード用途では危険性そのものです。漏洩 DB に対し攻撃者は GPU 1 枚で毎秒数十億の SHA-256 を試せます。パスワードハッシュ関数は意図的に遅く(通常 100 ms 程度)、メモリも要求します(CPU より高価なリソース)。「不可能にする」ではなく「経済的に不可能にする」ことが目標です。

bcrypt — 長年の定番

bcrypt は 1999 年に Blowfish 暗号をベースに作られました。コストファクター(work factor)が調整可能で、1 増やすごとに計算時間が倍になります。2026 年時点ではコスト 12〜14 が妥当です。ほぼ全言語で対応があり、長年の解析でも実用的な攻撃は見つかっていません。弱点はメモリ使用量が固定で小さく、GPU や FPGA で比較的効率的に攻撃できる点です。

scrypt — メモリハードの先駆者

scrypt は 2009 年に、ハードウェア加速攻撃への耐性を狙って設計されました。1 ハッシュごとに大きなメモリ(通常 16〜64 MB)が必要で、GPU や ASIC ではメモリ実装が高コストなため攻撃難度が大きく上がります。トレードオフは設定が複雑(N、r、p の 3 つのパラメータ)で、メモリ制約のあるサーバでは負担が大きくなる点です。

Argon2 — 現代の本命

Argon2 は 2015 年のパスワードハッシュコンペで優勝し、現在の推奨デフォルトです。3 バリアントあります。Argon2d(データ依存・速いがサイドチャネル脆弱性)、Argon2i(データ非依存・共有メモリ環境で安全)、Argon2id(ハイブリッド・多くの用途で推奨)。Argon2 は最も柔軟(時間・メモリ・並列度を独立に調整可能)かつ最も近代的で、既知攻撃に対して最も強固です。

比較表

  • bcrypt: 1999、時間コストのみ、メモリ約 4 KB、対応言語が広い。
  • scrypt: 2009、メモリハード、N/r/p の調整が必要、設定難易度高め。
  • Argon2id: 2015、時間・メモリ・並列度を調整可能、現行推奨。

チューニングパラメータ

いずれの関数もパラメータでハッシュ時間とセキュリティのバランスを取れます。本番サーバで 1 ハッシュ約 100 ms が目安です。ユーザーログインでは気にならず、総当たり規模ではコストが莫大になります。OWASP は Argon2id でメモリ 19 MiB、反復 2、並列 1 を最低ラインとして推奨。bcrypt は 2026 年時点でコスト 12 以上が下限。scrypt は N=2^17(約 128 MB)、r=8、p=1 が一般的です。

移行戦略

既存ユーザーが bcrypt で保存されていて Argon2id へ移行する場合、ログイン時再ハッシュが標準手法です。ログイン成功時に旧ハッシュで検証してから即座に新関数で再ハッシュし、保存レコードを更新します。数ヶ月で大半のアクティブユーザーが透過的に移行されます。非アクティブユーザーはそのまま bcrypt のままで構いません(依然として安全です)。

ペッパーは必要?

ペッパーは全パスワードに共通で混ぜる単一の秘密値で、DB とは別の場所(HSM や環境変数)に保管します。ソルトの代わりにはなりません(各ユーザーは個別のソルトが必要)が、DB だけ漏洩しシークレットストアが守られているケースで深層防御として機能します。高セキュリティ用途では推奨します。

よくある質問

既存の bcrypt ハッシュを Argon2id に移行すべきですか?
急ぐ必要はありません。適切に設定された bcrypt は 2026 年時点でも安全です。余裕があれば移行し、なければ他のセキュリティ作業を優先してください。ログイン時再ハッシュが最も実装が楽です。
PBKDF2 は今でも許容されますか?
許容はされますが新規システムでは推奨しません。PBKDF2 は FIPS や NIST SP 800-63B などの規制標準に含まれているため、コンプライアンス上必要な場合があります。社内システムであれば Argon2id を選んでください。
ハッシュの保存形式はどうする?
各関数に対応する modular crypt format を使うのが標準です。Argon2 なら `$argon2id$v=19$m=19456,t=2,p=1$<salt>$<hash>` のような文字列にパラメータ・ソルト・ハッシュをまとめます。検証時にこの文字列から設定を復元できます。

まとめ

新規システムでは Argon2id を使い、bcrypt は機を見て移行してください。各パスワードに必ずソルト、本番ハードで約 100 ms を目安にチューニング、SHA-256 のような汎用ハッシュをパスワード保存に使わない。テスト用パスワードは本サイトのパスワード生成ツールで作成し、内部原理は「ハッシュ関数の基礎」ガイドを参照してください。

関連ツール