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

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

Argon2 を利用することは「現代の攻撃に最も強いパスワードハッシュを実務で安全に扱うための必須ユーティリティです」

読者のみなさんが業務システムを開発する際、 パスワードを安全に保存することは最重要のセキュリティ要件です。 その中でも Argon2 は、PBKDF2 や bcrypt よりも強力で、 現代の GPU・クラウド・専用ハードウェアによる攻撃に最も耐性があります。

ここでは、初心者でも理解できるように、 Argon2 の仕組み・使い方・実務テンプレートを丁寧に解説します。

なぜ Argon2 が必要なのかを理解する

パスワード攻撃は年々強力になっています

攻撃者は次のような装備を使います。

  • GPU(1 秒間に数十億回の計算が可能)
  • 専用ハードウェア(FPGA / ASIC)
  • クラウドで大量の計算リソース

そのため、高速なハッシュ(SHA256 など)は一瞬で破られます

Argon2 が解決する問題

Argon2 は次の 3 つの攻撃に強いように設計されています。

  • 総当たり攻撃(Brute Force)
  • GPU による高速計算攻撃
  • 並列化による高速化攻撃

これらを防ぐために、Argon2 は「メモリを大量に使わせる」仕組みを持っています。

Argon2 の種類を理解する

Argon2 には 3 種類あります。

種類特徴
Argon2dGPU攻撃に強い
Argon2iサイドチャネル攻撃に強い
Argon2id両方の長所を併せ持つ(実務で最も推奨)

実務では Argon2id を使うのが最適です。

Argon2 の「3つの設定パラメータ」を理解する

Argon2 の強さは、次の 3 つの設定で決まります。

① MemoryCost(メモリ量)

大量のメモリを使わせることで、 GPU や専用ハードウェアが攻撃しづらくなります。

例:64MB、128MB など

② TimeCost(計算回数)

計算を何回繰り返すか。

例:2〜5 回

③ DegreeOfParallelism(並列度)

CPU のコア数に合わせて並列計算させる。

例:CPU コア数と同じ値

これらを調整することで、 攻撃者にとって「計算が重く、メモリも大量に必要」な状態を作れます。

C# で Argon2 を使うためのライブラリを選ぶ

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

最も有名なのは:

  • Isopoh.Cryptography.Argon2

実務でもよく使われる安定したライブラリです。

Argon2 を使ったハッシュ化テンプレート(実務向け)

初心者でも使えるように、 「そのままコピペで使える」テンプレートを用意しました。

using System;
using System.Security.Cryptography;
using Isopoh.Cryptography.Argon2;

public static class Argon2Utility
{
    public static string HashPassword(string password)
    {
        // ランダムソルト生成(16バイト)
        byte[] salt = RandomNumberGenerator.GetBytes(16);

        var config = new Argon2Config
        {
            Type = Argon2Type.Argon2id,       // 推奨方式
            Version = Argon2Version.Nineteen,
            Password = System.Text.Encoding.UTF8.GetBytes(password),
            Salt = salt,
            TimeCost = 4,                     // 計算回数
            MemoryCost = 1024 * 64,           // 64MB
            Lanes = Environment.ProcessorCount,
            Threads = Environment.ProcessorCount,
            HashLength = 32                   // 256bit
        };

        var argon2 = new Argon2(config);
        return argon2.Hash();
    }

    public static bool VerifyPassword(string password, string hash)
    {
        return Argon2.Verify(hash, password);
    }
}
C#

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

登録時(Sign Up)

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

※ ソルトはハッシュ内部に埋め込まれるため、別途保存不要です。

ログイン時(Sign In)

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

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

  • パスワードを平文で保存する
  • SHA256 など高速ハッシュを使う
  • ソルトを自分で保存しようとする(Argon2 が内部で管理する)
  • メモリ量を少なくする(攻撃者が高速化できる)
  • 設定値を軽くしすぎる(安全性が落ちる)

Argon2 の実務的ベストプラクティス

  • Argon2id を使う(最も安全)
  • メモリ量は 32〜128MB が推奨
  • 計算回数(TimeCost)は 2〜5
  • 並列度は CPU コア数に合わせる
  • ハッシュ値はそのまま保存する
  • ログイン試行回数制限(レートリミット)と併用する

PBKDF2 / bcrypt / Argon2 の比較(初心者向け)

方式安全性GPU攻撃耐性メモリハード.NETでの使いやすさ
PBKDF2高い弱いなし標準で使える
bcrypt高い強い少し外部ライブラリ
Argon2最強最強強い外部ライブラリ

Argon2 は 現代の攻撃に最も強い方式 と言われています。

まとめ — Argon2 は「次世代の最強パスワードハッシュ方式」です

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

  • メモリハードで GPU攻撃に強い
  • 並列化耐性で高速化を防ぐ
  • 設定可能なパラメータで安全性を調整できる

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

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

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