T도구모음

비밀번호 생성기

안전한 랜덤 비밀번호를 생성합니다. 길이와 포함 문자를 설정할 수 있습니다.

824405664

비밀번호 생성기 — NIST SP 800-63B 기반, CSPRNG으로 만드는 실전 패스워드

Verizon의 DBIR(Data Breach Investigations Report)을 보면 매년 침해 사고의 절반 이상이 "자격 증명 도용(credential stuffing)"에서 시작됩니다. 그중 상당수가 약한 비밀번호이거나 여러 서비스에 재사용된 비밀번호가 원인입니다. 이 도구는 NIST SP 800-63B Digital Identity Guidelines의 권고를 반영한 문자 집합 옵션과 길이 슬라이더를 제공하며, 브라우저의crypto.getRandomValues() — 즉 CSPRNG(Cryptographically Secure Pseudo-Random Number Generator)를 사용해 예측 불가능한 비밀번호를 생성합니다.Math.random()은 V8 엔진의 xorshift128+ 알고리즘 기반으로 시드가 결정적이므로 보안 목적으로는 절대 사용하면 안 됩니다. 실제로 "비밀번호 재설정 토큰이 유추되었다"는 사고가 이 때문에 발생합니다.

엔트로피 계산 — 숫자로 확인하는 비밀번호 강도

비밀번호의 이론적 강도는 엔트로피(비트)로 측정합니다. 공식은 E = L * log2(N)이며, N은 문자 집합 크기, L은 비밀번호 길이입니다. 엔트로피가 높을수록 brute force에 필요한 시도 횟수가 기하급수적으로 증가합니다.

구성집합 크기 N길이 L엔트로피(bit)판정
숫자만10826.6위험 — 즉시 크랙 가능
소문자만261256.4보통 — 오프라인 공격에 취약
전체 ASCII(94)941278.6강함
전체 ASCII(94)9416104.9매우 강함 — 권장
전체 ASCII(94)9420131.1최상 — 관리자 계정 추천

NIST SP 800-63B는 사용자 생성 비밀번호에 "최소 8자 + 유출된 비밀번호 차단 목록 검증"을 요구하며, 기계 생성 비밀번호는 6자 이상에서 최소 20비트 엔트로피를 충족해야 합니다. 실무적으로는 OWASP가 권장하는 12자 이상 + 대·소문자·숫자·특수문자 4가지 클래스를 목표로 잡고, 비밀번호 품질은 Dropbox가 공개한 zxcvbn 라이브러리로 측정하는 것이 가장 정확합니다. zxcvbn은 사전 단어, 키보드 패턴(qwerty, 1234), l33t 치환까지 분석하기 때문입니다.

용도별 실무 정책 가이드

  • 일반 사용자 계정 — 12자 이상, haveibeenpwned.com의 Pwned Passwords API로 유출 여부 확인 + MFA 권장.
  • 관리자 / root — 20자 이상 CSPRNG 생성, HashiCorp Vault 같은 secret manager에 저장, 접근 로그 감사.
  • API 키 / 시크릿 — 32바이트 랜덤을 base64url 인코딩(약 43자). openssl rand -base64url 32로 생성.
  • DB 루트 비밀번호 — Vault 동적 시크릿 + 자동 로테이션(24시간 이하 TTL) + 최소 노출 원칙.
  • 일회용 초대 토큰 — CSPRNG 32바이트 + TTL 24시간 + 단일 사용 후 무효화 + 서명된 URL.

구체 예시 — 생성 결과 비교

// 길이 12 (소문자+숫자, N=36)
k8r2fpq9nw3m              엔트로피 약 62bit

// 길이 16 (전체 ASCII 94자)
j#7Kp2@Lq9!mNx$4          엔트로피 약 105bit

// 길이 20 (전체 ASCII 94자)
8R!tK3@mP9qN#2vL&x7d      엔트로피 약 131bit

// API 키 (32바이트 base64url)
aZ3kK9p2nQ8mXr7vT1wLc5hS4bY6jU0gF-dM_iH=

// Node.js 생성 예시
require('crypto').randomBytes(32).toString('base64url');

디버깅 사례 — Math.random과 모듈로 편향

초기에 Math.random() * charset.length로 비밀번호를 생성하는 코드를 프로덕션에 올린 적이 있습니다. 보안 감사에서 "Math.random은 xorshift128+ 기반이고, 브라우저 시작 시점의 타이밍 정보에서 시드를 유추할 수 있다"는 지적을 받고 즉시 crypto.getRandomValues(new Uint32Array(len))로 교체했습니다. 추가로 모듈로 편향(modulo bias) 문제도 발견했는데, 32비트 난수(0~4,294,967,295)를 94(문자 집합 크기)로 나머지 연산하면 낮은 인덱스가 통계적으로 미세하게 더 자주 선택됩니다. 비밀번호 길이가 충분하면 실질적 위험은 미미하지만, 엄밀한 균일 분포가 필요한 경우 rejection sampling(범위 밖 값은 버리고 재추출)을 적용합니다.

보안 체크리스트

  • 생성 후 클립보드에 복사한 비밀번호는 사용 즉시 클립보드를 비우세요. 악성코드가 클립보드를 모니터링합니다.
  • 동일한 비밀번호를 여러 서비스에 재사용하지 마세요 — credential stuffing 공격의 출발점입니다.
  • NIST는 "정기 강제 변경"을 더 이상 권장하지 않습니다. 강한 비밀번호 + 유출 모니터링이 효과적입니다.
  • 서버 저장 시에는 반드시 Argon2id(RFC 9106) / bcrypt(cost 12+) / scrypt + 고유 salt를 사용하세요.
  • MFA(TOTP, WebAuthn/FIDO2)를 활성화하면 비밀번호가 유출되어도 계정 탈취를 방지할 수 있습니다.

관련 도구

생성한 비밀번호를 서버에 저장할 때 적합한 해시 알고리즘은 해시 생성기에서 비교해 보고, 비밀번호 복잡도 정규식(예: ^(?=.*[A-Z])(?=.*\d)(?=.*[!@#$]).{12,}$)은 정규식 테스터에서 실시간 검증할 수 있습니다. 비밀번호 정책 문서 변경 이력은 텍스트 차이 비교로 추적하세요.

참고 자료

  • NIST SP 800-63B — Digital Identity Guidelines: Authentication and Lifecycle Management
  • OWASP Authentication Cheat Sheet — 비밀번호 저장 및 정책 권고
  • RFC 9106 — Argon2 Memory-Hard Function for Password Hashing and Proof-of-Work
  • Dropbox zxcvbn — Realistic Password Strength Estimation (GitHub 오픈소스)
  • MDN Web Docs — Crypto.getRandomValues() API 레퍼런스

자주 묻는 질문

관련 도구