C# Tips | セキュリティ:パスワードを安全にHashする

C# C#
スポンサーリンク
スポンサーリンク

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 の違いを表で比較

項目PBKDF2bcrypt
設計思想標準仕様(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 の違い

タイトルとURLをコピーしました