🔑 취약한 비밀번호 허용 시뮬레이터 KISA A-2 · 취약한 비밀번호 허용
비밀번호 정책이 없는 회원가입 폼은 '123456', 'password', 사전 단어를 그대로 받습니다 — 즉시 크랙 가능. 길이·문자 종류를 강제하고 유출/사전 비밀번호를 거부하는 정책과 비교하세요.
① 취약한 회원가입: 정책 없음 VULNERABLE
취약한 폼은 비어있지 않으면 어떤 비밀번호든 받습니다. 실시간 강도 미터가 취약함을 보여주고 빠른 해시 기준 오프라인 크랙 시간을 추정합니다 — 흔한 비밀번호는 즉시 뚫립니다.
② 안전한 회원가입: 정책 + 유출 검사 SECURE
안전한 폼은 길이 ≥ 12, 여러 문자 종류를 요구하고 k-익명성 범위 검사로 사전/유출 비밀번호를 거부합니다(해시 접두사만 전송 — 전체 비밀번호 미전송). 강한 비밀번호는 크랙 시간을 수 세기로 끌어올립니다.
③ 취약 vs 안전 코드
VULNERABLE
# Python (Flask) — 검증 없음
@app.post("/register")
def register():
pw = request.form["password"]
if not pw: # 비어있지 않으면 통과
abort(400)
db.save(user, md5(pw)) # 약한 해시까지...
return "ok"
SECURE
# 정책 + 유출목록(k-익명성) 검사
import re, hashlib
def weak(pw):
if len(pw) < 12: return "too short"
classes = sum(bool(re.search(p, pw))
for p in [r"[a-z]", r"[A-Z]", r"\d", r"[^\w]"])
if classes < 3: return "need 3+ char classes"
if pw.lower() in COMMON: return "common password"
# HIBP range API: send only SHA1 prefix(5)
if breached_prefix(sha1(pw)[:5], sha1(pw)[5:]):
return "found in breach corpus"
return None
# 저장은 Argon2id(salt) 사용
방어 핵심: 길이 ≥ 12 강제(복잡도 규칙보다 패스프레이즈) · 상위 유출/사전 비밀번호 차단(k-익명성: 해시 접두사만 전송) · 속도 제한 + 잠금 + MFA · 느린 salt KDF(Argon2id/bcrypt)로 저장. 길이가 복잡도를 이깁니다.
⚠️ 교육용 시뮬레이션입니다. 사전·유출 검사·크랙 시간은 모두 페이지 내부 mock이며 비밀번호는 어디로도 전송되지 않고 실제 유출 DB를 조회하지 않습니다.