비밀번호 정책 테스터
사용자 지정 정책 규칙으로 비밀번호를 테스트합니다(길이, 복잡성, 금지 단어).
정책 규칙
이 도구 소개
패스워드 정책 테스터는 비밀번호를 설정 가능한 보안 규칙에 대해 검증하여 조직이나 애플리케이션의 특정 요구사항을 충족하는지 확인하는 도구입니다. 비밀번호가 충분히 강한지를 추측하는 대신, 이 도구는 여러 기준에 대해 검사합니다. 최소 길이, 복잡성 규칙(대문자, 소문자, 숫자, 기호), 그리고 금지된 단어 목록입니다. 비밀번호가 어떤 규칙을 통과하고 어떤 규칙에 실패하는지 이해하면 약한 비밀번호를 강화하고 시스템 전체에 걸쳐 일관된 보안 기준을 보장할 수 있습니다.
테스터를 사용하는 것은 간단합니다. 비밀번호를 입력하고 중요한 정책 규칙을 커스터마이징합니다. 최소 길이 요구사항을 설정하고, 복잡성 규칙을 켜거나 끄며, 비밀번호에 나타나면 안 되는 금지된 단어나 패턴을 추가합니다. 도구는 비밀번호가 충족하는 규칙과 실패하는 규칙을 즉시 표시하여 시각적 피드백을 제공합니다. 이는 인증 시스템을 구축하는 개발자, 기업 비밀번호 정책을 시행하는 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.