C# Tips | セキュリティ:パスワード強度を検証する

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

パスワード強度を検証することは「ユーザーの安全を守るための最初の防御線」です

読者のみなさんが業務システムを開発する際、 パスワード強度チェックは必須のセキュリティ機能です。 どれだけ強力なハッシュ方式(PBKDF2 / bcrypt / Argon2)を使っても、 ユーザーが「123456」「password」「abcd」などの弱いパスワードを使ってしまえば意味がありません。

ここでは、初心者でも理解できるように、パスワード強度検証の仕組み・実務テンプレート・深掘りポイントを丁寧に解説します。

パスワード強度検証の目的は「弱いパスワードを事前に拒否すること」です

弱いパスワードは攻撃者の“ごちそう”です

攻撃者は次のような方法でパスワードを破ります。

  • 辞書攻撃(よく使われる単語を試す)
  • 総当たり攻撃(すべての組み合わせを試す)
  • リスト攻撃(漏洩したパスワードを使う)

弱いパスワードは 数秒〜数分で破られます

強度検証は、ユーザーが登録時に弱いパスワードを入力した場合、 システム側で「そのパスワードは危険です」と判断し、 より安全なパスワードを促すための仕組みです。

強いパスワードの条件を理解する(初心者向けにかみ砕く)

強いパスワードは次の条件を満たします。

  • 長さが十分にある(最低 12〜16 文字)
  • 大文字・小文字を含む
  • 数字を含む
  • 記号を含む
  • 辞書にある単語を使わない
  • 繰り返しや連番を使わない(1111、abcd、1234)

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

C# でパスワード強度を検証するための基本ロジックを考える

初心者向けに、まずは「最低限のチェック」を作ります。

チェック項目:

  • 長さチェック
  • 大文字チェック
  • 小文字チェック
  • 数字チェック
  • 記号チェック
  • 禁止パターンチェック

これらを順番にチェックすることで、 安全なパスワードかどうかを判定できます。

実務で使えるパスワード強度検証ユーティリティ(テンプレート)

そのままコピペで使えるテンプレートです。

using System;
using System.Linq;
using System.Text.RegularExpressions;

public static class PasswordStrengthUtility
{
    public static PasswordStrengthResult Validate(string password)
    {
        var result = new PasswordStrengthResult();

        if (string.IsNullOrWhiteSpace(password))
        {
            result.AddError("パスワードが入力されていません。");
            return result;
        }

        // 長さチェック
        if (password.Length < 12)
            result.AddError("パスワードは12文字以上にしてください。");

        // 大文字
        if (!password.Any(char.IsUpper))
            result.AddError("大文字を1文字以上含めてください。");

        // 小文字
        if (!password.Any(char.IsLower))
            result.AddError("小文字を1文字以上含めてください。");

        // 数字
        if (!password.Any(char.IsDigit))
            result.AddError("数字を1文字以上含めてください。");

        // 記号
        if (!Regex.IsMatch(password, @"[\W_]"))
            result.AddError("記号を1文字以上含めてください。");

        // 連番チェック
        if (Regex.IsMatch(password, @"1234|abcd|1111"))
            result.AddError("連番や単純な並びは使用しないでください。");

        return result;
    }
}

public class PasswordStrengthResult
{
    public bool IsValid => !Errors.Any();
    public List<string> Errors { get; } = new();

    public void AddError(string message)
    {
        Errors.Add(message);
    }
}
C#

実務コード例(使い方)

var result = PasswordStrengthUtility.Validate("Password123!");

if (!result.IsValid)
{
    foreach (var error in result.Errors)
    {
        Console.WriteLine(error);
    }
}
else
{
    Console.WriteLine("安全なパスワードです。");
}
C#

さらに強力な検証を追加する(深掘り)

辞書攻撃対策(辞書にある単語を禁止)

例:apple, orange, love, secret など

string[] weakWords = { "password", "love", "secret", "admin" };
if (weakWords.Any(w => password.ToLower().Contains(w)))
{
    result.AddError("辞書にある単語を含めないでください。");
}
C#

漏洩パスワードチェック(Have I Been Pwned API)

漏洩したパスワードを拒否することができます。

漏洩パスワードチェック

パスワード強度スコアリング

長さ・種類・複雑性からスコアを計算し、 「弱い」「普通」「強い」などの評価を返すこともできます。

パスワード強度検証で絶対にやってはいけないこと

  • パスワードをログに出力する
  • パスワードを平文で保存する
  • 強度チェックを甘くする(8文字など)
  • 辞書攻撃対策を無視する
  • ユーザーに強度を説明しない

これらはすべてセキュリティ事故につながります。

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

  • 最低 12〜16 文字を推奨
  • 大文字・小文字・数字・記号を必須にする
  • 辞書攻撃対策を入れる
  • 漏洩パスワードチェックを導入する
  • パスワード強度を UI で可視化する(ゲージ表示など)
  • 強度チェックとハッシュ化(PBKDF2 / bcrypt / Argon2)を併用する

まとめ:パスワード強度検証は「ユーザーを守る最初の防御線」です

パスワード強度検証の本質は次の 3 つです。

  • 弱いパスワードを事前に拒否する
  • 攻撃者が推測できない複雑なパスワードを促す
  • ハッシュ化と組み合わせて安全性を最大化する

強度検証を導入するだけで、 システム全体のセキュリティレベルが大幅に向上します。

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