C# Tips | セキュリティ:BCryptを利用する

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

BCrypt を利用することは「パスワードを“攻撃者が高速に推測できない形”で保存するための強力なユーティリティです」

業務システムでは、ユーザーのパスワードを安全に扱うことが必須です。 そのために使われる代表的な方式が BCrypt です。 BCrypt は PBKDF2 と同じく「安全なパスワードハッシュ方式」ですが、 GPU による高速総当たり攻撃に強い という特徴があります。

初心者の方にも分かりやすいように、 BCrypt の仕組み、実務で使えるコード例、テンプレート、そして深掘りポイントまでを 連続した流れで丁寧に解説します。

BCrypt の基本は「計算を重くし、メモリも使わせることで攻撃を遅らせる」ことです

BCrypt が解決したい問題

攻撃者は GPU や専用ハードウェアを使って、 1 秒間に何億回もパスワードを試すことができます。

そのため、SHA256 や SHA512 のような高速ハッシュは危険です。

BCrypt は次のような特徴を持ちます。

  • 計算を重くする(コスト値)
  • メモリを多く使わせる(メモリハード)
  • ソルトを自動生成する
  • パスワード専用に設計されている

これにより、攻撃者がパスワードを推測するのが極端に難しくなります。

BCrypt の仕組みを初心者向けにかみ砕く

① ソルトを自動生成する

BCrypt は内部で必ずランダムソルトを生成します。 そのため、同じパスワードでも毎回違うハッシュ値になります。

② コスト値(work factor)で計算量を調整できる

BCrypt の特徴は「計算量を簡単に調整できる」ことです。

例:

  • コスト 10 → やや重い
  • コスト 12 → 実務でよく使われる
  • コスト 14 → かなり重い(高セキュリティ環境向け)

コスト値を上げると、攻撃者の総当たり攻撃が極端に遅くなります。

③ メモリハードで GPU 攻撃に強い

BCrypt は内部で Blowfish 暗号を使い、 メモリを多く使わせる設計になっています。

GPU はメモリが少ないため、 BCrypt の計算が苦手です。

C# で BCrypt を利用する(実務向けテンプレート)

.NET では標準で BCrypt が使えないため、外部ライブラリを利用します

最も有名なのは BCrypt.Net-Next です。

BCrypt を使ったハッシュユーティリティ

using BCrypt.Net;

public static class BcryptUtility
{
    // パスワードをハッシュ化
    public static string HashPassword(string password, int workFactor = 12)
    {
        return BCrypt.Net.BCrypt.HashPassword(password, workFactor);
    }

    // パスワードを検証
    public static bool VerifyPassword(string password, string hash)
    {
        return BCrypt.Net.BCrypt.Verify(password, hash);
    }
}
C#

BCrypt を使ったパスワード保存の流れ

登録時(Sign Up)

  1. ユーザーがパスワードを入力
  2. BCrypt がソルトを自動生成
  3. BCrypt がハッシュ化
  4. ハッシュ値だけをデータベースに保存

BCrypt はソルトを内部に埋め込むため、 ソルトを別途保存する必要はありません。

ログイン時(Sign In)

  1. ユーザーがパスワードを入力
  2. データベースのハッシュ値を取得
  3. BCrypt が内部のソルトを使って再計算
  4. 一致すればログイン成功

BCrypt を使うときの「絶対にやってはいけないこと」

  • パスワードを平文で保存する
  • SHA256 など高速ハッシュを使う
  • ソルトを自分で生成して埋め込む(BCrypt が自動でやる)
  • コスト値を低くする(10 以下は危険)
  • ハッシュ値をログに出す

これらはすべて攻撃者に突破されます。

BCrypt を使うときの「実務的ベストプラクティス」

  • コスト値は 12〜14 が推奨
  • ハッシュ値はそのまま Base64 で保存する
  • パスワードは絶対に復号しない(ハッシュは不可逆)
  • ログイン試行回数の制限(レートリミット)と併用する
  • パスワードポリシー(長さ・複雑性)も併用する

PBKDF2 と BCrypt の違いを簡単にまとめる

項目PBKDF2BCrypt
設計思想標準仕様パスワード専用
GPU攻撃耐性やや弱い強い
メモリ使用少ない多い(攻撃者に不利)
.NETでの利用標準で使える外部ライブラリが必要
調整項目iterationcost

どちらも安全ですが、 Webサービスや高セキュリティ環境では BCrypt がよく使われます。

まとめ:BCrypt は「GPU攻撃に強いパスワード専用ハッシュ方式」です

BCrypt の本質は次の 3 つです。

  • ソルトを自動生成する
  • コスト値で計算量を調整できる
  • メモリハードで総当たり攻撃に強い

これらを組み合わせることで、 攻撃者がパスワードを推測するのを極端に難しくします。

多くの読者のみなさんが業務システムを開発する際、 BCrypt を正しく使うだけでセキュリティレベルが大幅に向上し、 ユーザーの秘密を安全に守ることができます。

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