コンテンツへスキップ
🛠️ToolsShed

パスワードポリシーテスター

カスタムポリシールールでパスワードをテストします(長さ、複雑さ、禁止ワード)。

ポリシールール

このツールについて

パスワードポリシーテスターは、パスワードを設定可能なセキュリティルールに対して検証し、組織またはアプリケーションの特定の要件を満たしているかを確認するツールです。パスワードが十分に強いかどうかを推測する代わりに、このツールは複数の基準に対して検査します。最小長、複雑性ルール(大文字、小文字、数字、記号)、および禁止単語のブラックリストです。パスワードがどのルールに失敗し、どのルールに合格するかを理解することで、脆弱なパスワードを強化し、システム全体で一貫したセキュリティ基準を確保できます。

テスターの使い方は簡単です。パスワードを入力し、重要なポリシールールをカスタマイズします。最小長要件を設定し、複雑性ルールのオン/オフを切り替え、パスワードに含まれるべきではない禁止単語またはパターンを追加します。ツールは、パスワードが満たすルールと失敗するルールを即座に表示し、視覚的なフィードバックを提供します。これは、認証システムを構築する開発者、企業のパスワードポリシーを実施するITアドミニストレーター、およびデプロイメントまたはユーザー登録前にパスワードを検証する必要がある誰もが特に役に立ちます。

パスワードポリシーはサイバーセキュリティの基盤であり、異なるコンテキストは異なるルールを必要とします。シンプルなPINはエンタープライズパスワードと異なり、暗号化キーとも異なります。このテスターは、セキュリティ強度とユーザビリティの間のトレードオフを探索し、特定のルールが重要である理由を理解するのに役立ちます。チームのパスワードポリシーを設計する場合、ユーザーにセキュリティ基準の訓練をする場合、またはパスワード強度評価について単に好奇心がある場合でも、このツールは安全な認証の背後にあるルールを明確にします。

よくある質問

コード実装

import re
from dataclasses import dataclass, field
from typing import Optional

@dataclass
class PasswordPolicy:
    min_length: int = 8
    max_length: int = 128
    require_uppercase: bool = True
    require_lowercase: bool = True
    require_digit: bool = True
    require_symbol: bool = True
    min_unique_chars: int = 5
    forbidden_patterns: list[str] = field(default_factory=lambda: [
        r"(..)\1{2,}",       # repeated two-char block 3+ times
        r"(.)\1{3,}",         # same char 4+ times in a row
        r"(?i)password",       # literal word "password"
        r"(?i)qwerty",
    ])
    symbol_chars: str = r"!@#$%^&*()-_=+[]{}|;':",./<>?"

@dataclass
class PolicyResult:
    passed: bool
    violations: list[str] = field(default_factory=list)
    score: int = 0  # 0-100

def check_password(password: str, policy: Optional[PasswordPolicy] = None) -> PolicyResult:
    if policy is None:
        policy = PasswordPolicy()

    violations: list[str] = []
    score = 0

    # Length checks
    if len(password) < policy.min_length:
        violations.append(f"Too short: minimum {policy.min_length} characters")
    elif len(password) >= policy.min_length:
        score += 25

    if len(password) > policy.max_length:
        violations.append(f"Too long: maximum {policy.max_length} characters")

    # Character class checks
    if policy.require_uppercase and not re.search(r"[A-Z]", password):
        violations.append("Must contain at least one uppercase letter")
    else:
        score += 15

    if policy.require_lowercase and not re.search(r"[a-z]", password):
        violations.append("Must contain at least one lowercase letter")
    else:
        score += 15

    if policy.require_digit and not re.search(r"\d", password):
        violations.append("Must contain at least one digit")
    else:
        score += 15

    if policy.require_symbol and not re.search(
        f"[{re.escape(policy.symbol_chars)}]", password
    ):
        violations.append("Must contain at least one symbol")
    else:
        score += 15

    # Unique characters
    if len(set(password)) < policy.min_unique_chars:
        violations.append(f"Must use at least {policy.min_unique_chars} different characters")
    else:
        score += 15

    # Forbidden patterns
    for pattern in policy.forbidden_patterns:
        if re.search(pattern, password):
            violations.append(f"Contains forbidden pattern: {pattern}")

    passed = len(violations) == 0
    return PolicyResult(passed=passed, violations=violations, score=min(score, 100))


# Example usage
if __name__ == "__main__":
    tests = ["abc", "Password1!", "C0rrectH0rseBatteryStaple!"]
    policy = PasswordPolicy(min_length=12)
    for pwd in tests:
        result = check_password(pwd, policy)
        print(f"{pwd!r}: passed={result.passed}, score={result.score}")
        for v in result.violations:
            print(f"  - {v}")

Comments & Feedback

Comments are powered by Giscus. Sign in with GitHub to leave a comment.