bcrypt と PBKDF2 の違いは「どちらも安全だが“設計思想”と“攻撃への強さ”が違う」という点にあります
プログラミング初心者の方にとって、bcrypt と PBKDF2 は名前からして難しそうに見えますが、 どちらも 「パスワードを安全に保存するためのハッシュ方式」 です。
ただし、内部の仕組み・得意分野・実務での使われ方には明確な違いがあります。 ここでは、初心者でも理解できるように、例題・コード・テンプレートを交えながら丁寧に解説します。
bcrypt と PBKDF2 の違いを一言でまとめると?
- PBKDF2 → 暗号学の標準仕様(RFC2898)。 反復回数を増やして「計算を重くする」ことで攻撃を防ぐ。
- bcrypt → パスワード専用に設計されたハッシュ方式。 CPU だけでなく メモリも使わせる ことで攻撃を防ぐ。
どちらも安全ですが、 bcrypt の方が「総当たり攻撃に強い」設計になっている という点が大きな違いです。
PBKDF2 の特徴(初心者向けにやさしく)
PBKDF2 は「標準仕様で、どの言語でも使える万能型」
PBKDF2 は RFC2898 という国際標準で定義されている方式で、 .NET / Java / Python / Go / Node.js など ほぼすべての言語で標準サポート されています。
PBKDF2 の強み
- 標準仕様で信頼性が高い
- 実装が豊富で使いやすい
- HMAC-SHA256 / SHA512 などを内部で使う
- 反復回数(iteration)を増やすことで強度を調整できる
PBKDF2 の弱み
- CPU だけを使うため、 GPU による高速総当たり攻撃に弱い(bcrypt よりは弱い)
bcrypt の特徴(初心者向けにやさしく)
bcrypt は「パスワード専用に設計された攻撃耐性の高い方式」
bcrypt は Blowfish という暗号をベースにしたハッシュ方式で、 メモリを多く使わせる設計になっています。
bcrypt の強み
- GPU による高速攻撃に強い
- パスワード専用に設計されている
- コスト(計算量)を簡単に調整できる
- 実務で非常に広く使われている(Linux / Webサービスなど)
bcrypt の弱み
- PBKDF2 ほど標準化されていない
- .NET では標準ライブラリに含まれていない(外部ライブラリが必要)
bcrypt と PBKDF2 の違いを表で比較
| 項目 | PBKDF2 | bcrypt |
|---|---|---|
| 設計思想 | 標準仕様(RFC2898) | パスワード専用 |
| 攻撃耐性 | CPU攻撃に強いがGPU攻撃に弱い | GPU攻撃に強い |
| メモリ使用 | 少ない | 多い(攻撃者に不利) |
| 実装のしやすさ | .NET標準で使える | 外部ライブラリが必要 |
| 調整項目 | iteration(反復回数) | cost(計算コスト) |
| 実務利用 | 企業システムで多い | Webサービスで多い |
C# で PBKDF2 を使う例(実務向けテンプレート)
using System;
using System.Security.Cryptography;
using Microsoft.AspNetCore.Cryptography.KeyDerivation;
public static class Pbkdf2Utility
{
public static (string Hash, string Salt) HashPassword(string password)
{
byte[] salt = RandomNumberGenerator.GetBytes(128 / 8);
string hash = Convert.ToBase64String(KeyDerivation.Pbkdf2(
password: password,
salt: salt,
prf: KeyDerivationPrf.HMACSHA256,
iterationCount: 100000,
numBytesRequested: 256 / 8));
return (hash, Convert.ToBase64String(salt));
}
public static bool VerifyPassword(string password, string storedHash, string storedSalt)
{
byte[] saltBytes = Convert.FromBase64String(storedSalt);
string hash = Convert.ToBase64String(KeyDerivation.Pbkdf2(
password: password,
salt: saltBytes,
prf: KeyDerivationPrf.HMACSHA256,
iterationCount: 100000,
numBytesRequested: 256 / 8));
return CryptographicOperations.FixedTimeEquals(
Convert.FromBase64String(storedHash),
Convert.FromBase64String(hash));
}
}
C#C# で bcrypt を使う例(外部ライブラリ)
.NET では標準で bcrypt が使えないため、 BCrypt.Net-Next などのライブラリを使います。
using BCrypt.Net;
public static class BcryptUtility
{
public static string HashPassword(string password)
{
return BCrypt.Net.BCrypt.HashPassword(password, workFactor: 12);
}
public static bool VerifyPassword(string password, string hash)
{
return BCrypt.Net.BCrypt.Verify(password, hash);
}
}
C#初心者向けに「どっちを使えばいいか?」を明確にする
企業システム・業務アプリなら PBKDF2 が向いています
- .NET 標準で使える
- 実装が簡単
- 保守しやすい
- セキュリティ要件を満たしやすい
→ PBKDF2 が最も現実的で安全
Webサービス・高セキュリティ環境なら bcrypt も選択肢
- GPU攻撃に強い
- パスワード専用設計
- 実務で広く使われている
→ bcrypt はより強力な選択肢
まとめ:bcrypt と PBKDF2 はどちらも安全だが「得意分野」が違う
- PBKDF2 → 標準仕様で使いやすい。企業システムで最適。
- bcrypt → GPU攻撃に強い。Webサービスでよく使われる。
どちらも安全ですが、 C# の業務システムなら PBKDF2 が最も現実的で安全な選択 と言えます。
さらに深掘りしたい読者向け(Guided Links)
- PBKDF2 の内部計算
- ソルト生成のベストプラクティス
- ストレッチング回数の決め方
- Argon2 と bcrypt の違い

