비밀번호 생성기

브라우저의 암호학적 난수(crypto.getRandomValues)로 비밀번호를 만들고, 그 비밀번호가 얼마나 단단한지 엔트로피와 추정 해독 시간으로 보여줍니다. 서버로 전송되거나 저장되지 않습니다.

-
예상 강도: -문자 풀 크기: -평균 해독 시간(초당 100억 회 가정): -

이 생성기가 비밀번호를 만드는 방식

버튼을 누르면 브라우저가 운영체제의 보안 난수원에서 값을 받아 오는 crypto.getRandomValues()로 글자를 하나씩 뽑습니다. 체크한 문자 종류마다 최소 한 글자씩은 반드시 들어가도록 먼저 한 글자씩 배정하고, 나머지 자리는 선택한 모든 문자를 합친 풀에서 뽑은 뒤, 마지막에 전체 순서를 무작위로 섞습니다. 그래서 "4종류를 선택했는데 숫자가 하나도 안 나오는" 상황이 생기지 않습니다.

난수를 글자로 바꾸는 과정에서 흔한 실수가 두 가지 있는데, 이 도구는 둘 다 피했습니다. 첫째, 32비트 난수를 풀 크기로 그냥 나머지 연산(%)하면 풀 크기가 2의 거듭제곱이 아닐 때 앞쪽 글자가 아주 조금 더 자주 뽑히는 쏠림(모듈로 편향)이 생깁니다. 이 도구는 쏠림이 생기는 구간의 난수를 버리고 다시 뽑는 방식(거절 샘플링)으로 모든 글자의 확률을 같게 맞춥니다. 둘째, 글자를 고를 때 쓴 난수를 순서 섞기에 재사용하면 두 단계가 서로 연관되어 무작위성이 줄어듭니다. 순서 섞기(피셔-예이츠)는 매번 새로 뽑은 난수로 수행합니다.

엔트로피(bit)와 해독 시간 읽는 법

엔트로피는 "공격자가 가능한 비밀번호를 몇 번이나 시도해야 하는가"를 2의 거듭제곱 지수로 나타낸 값입니다. 문자 풀의 크기가 N이고 길이가 L이며 각 글자를 독립적으로 무작위로 뽑았다면 가능한 조합은 N의 L제곱 가지이고, 엔트로피는L × log2(N) bit입니다. bit가 1 늘 때마다 조합 수는 두 배가 됩니다. 평균적으로 전체 조합의 절반을 시도하면 맞히게 되므로, 평균 해독 시간은 2^(bit−1) ÷ 초당 시도 횟수로 계산합니다. 이 페이지의 표와 도구 화면은 모두 초당 100억 회(1010)라는 가정을 쓰는데, 이는 유출된 해시 파일을 GPU 여러 대로 오프라인에서 공격하는 상황을 단순화한 값입니다. 실제 속도는 서비스가 어떤 해시 방식을 쓰느냐에 따라 수천 배 이상 달라질 수 있으니, 절대적인 수명이 아니라 "서로 비교하는 눈금"으로 보시기 바랍니다.

문자 구성 × 길이별 엔트로피와 평균 해독 시간

아래 값은 빌드 시 공식으로 계산한 표입니다. 각 칸의 윗줄은 엔트로피(bit), 아랫줄은 초당 100억 회 가정의 평균 해독 시간입니다. 혼동 문자를 제외하지 않은 전체 문자 풀(대문자 26, 소문자 26, 숫자 10, 특수문자 18) 기준이며, 모든 글자를 균등한 확률로 독립적으로 뽑았다는 전제입니다.

문자 구성 (풀 크기)6자8자10자12자16자20자
숫자만 (10)20 bit
1초 미만
27 bit
1초 미만
33 bit
1초 미만
40 bit
50초
53 bit
6일
66 bit
158년
소문자만 (26)28 bit
1초 미만
38 bit
10초
47 bit
2시간
56 bit
55일
75 bit
7만 년
94 bit
316억 년
소문자+숫자 (36)31 bit
1초 미만
41 bit
2분
52 bit
2일
62 bit
8년
83 bit
1,261만 년
103 bit
우주 나이(약 138억 년)를 훨씬 넘김
대소문자+숫자 (62)36 bit
3초
48 bit
3시간
60 bit
1년
71 bit
5,112년
95 bit
755억 년
119 bit
우주 나이(약 138억 년)를 훨씬 넘김
대소문자+숫자+특수문자 18종 (80)38 bit
13초
51 bit
23시간
63 bit
17년
76 bit
11만 년
101 bit
우주 나이(약 138억 년)를 훨씬 넘김
126 bit
우주 나이(약 138억 년)를 훨씬 넘김

표에서 눈여겨볼 점은 "종류를 늘리는 것"보다 "길이를 늘리는 것"의 효과가 훨씬 크다는 사실입니다. 소문자만 쓴 20자는 풀이 26개뿐인데도, 대소문자+숫자+특수문자를 쓴 10자보다 엔트로피가 높습니다. 글자 하나를 추가하면 조합 수가 풀 크기 배(10배~80배)로 늘어나는 반면, 특수문자를 추가해 풀을 넓히는 효과는 로그로만 반영되기 때문입니다.

검산된 계산 예시

예시 1. 이 도구의 기본 설정(16자, 4종류 모두)

혼동 문자 제외 상태에서 풀은 대문자 24 + 소문자 25 + 숫자 8 + 특수문자 18 = 75개입니다(소문자에서는 l만 빠집니다). 엔트로피는 16 × log2(75) ≈ 100 bit이고, 초당 100억 회 가정의 평균 해독 시간은 우주 나이(약 138억 년)를 훨씬 넘김입니다. (각 종류를 최소 1글자씩 보장하는 규칙 때문에 실제 조합 수는 위 계산보다 아주 조금 적지만, 16자에서는 차이가 무시할 수준입니다.)

예시 2. 소문자+숫자 12자(혼동 문자 제외)

풀은 25 + 8 = 33개이므로 12 × log2(33) ≈ 12 × 5.04 ≈ 61 bit입니다. 평균 해독 시간은 3년으로, 시도 횟수가 제한된 온라인 로그인에는 넉넉하지만, 해시가 유출돼 오프라인 공격을 받을 수 있는 중요한 계정에는 16자 이상을 권합니다.

예시 3. 숫자 6자리 PIN

풀 10개, 6자리면 6 × log2(10) ≈ 20 bit, 조합은 100만 가지입니다. 오프라인에서는 1초 미만이면 끝나지만, 시도 횟수를 제한하는 서비스(예: 5회 틀리면 잠김)에서는 이야기가 달라집니다. 같은 비밀번호라도 "공격자가 얼마나 빨리 시도할 수 있는가"에 따라 안전도가 크게 달라집니다.

어떻게 설정하면 좋은가

복잡성 규칙보다 길이와 무작위성

"대문자, 숫자, 특수문자를 하나씩 넣으세요"라는 규칙은 사람이 만든 비밀번호에서 오히려 Password1!, Summer2024! 같은 뻔한 변형을 낳습니다. 공격자는 이런 패턴(단어 + 숫자 + 끝에 특수문자, a를 @로 바꾸기 등)을 이미 사전에 넣어 두고 먼저 시도합니다. 미국 NIST의 디지털 신원 지침(SP 800-63B)도 구성 규칙을 강제하기보다 충분한 길이를 허용하고, 유출된 비밀번호 목록과 대조하며, 주기적 변경 강제를 지양하라는 방향을 담고 있습니다. 구체적인 최소 길이 숫자는 개정판마다 다르므로 최신 문서를 확인하세요. 무작위로 생성한 문자열은 이런 "사람의 습관"이 없다는 점에서 근본적으로 다릅니다.

흔한 실수와 오해

이 도구의 한계와 쓰면 안 되는 경우

생성 후 해야 할 일

  1. 복사한 비밀번호를 비밀번호 관리자에 저장한 뒤 서비스의 비밀번호 변경 화면에 붙여 넣습니다. 순서를 반대로 하면 저장 전에 창을 닫아 계정에 접근하지 못할 수 있습니다.
  2. 2단계 인증을 켭니다. 비밀번호가 유출되어도 두 번째 장벽이 남습니다.
  3. 같은 비밀번호를 쓰던 다른 사이트가 있다면 함께 바꿉니다.
  4. 기존 비밀번호의 강도가 궁금하면 비밀번호 강도 검사기로 점검하되, 실제 쓰는 비밀번호는 입력하지 않는 편이 안전합니다.

관련 가이드: 비밀번호 관리자 가이드, 비밀번호 관리자 기초, 2단계 인증 가이드, UUID 생성기.

자주 묻는 질문

생성된 비밀번호가 저장되거나 서버로 전송되나요?

아니요. 생성은 모두 브라우저 안에서 이루어지고, 페이지를 닫거나 새로 고침하면 사라집니다. 비밀번호를 서버로 보내는 코드가 없으며, 브라우저 저장소에도 기록하지 않습니다.

어느 정도 길이가 안전한가요?

무작위로 만든 경우 4종류 문자 기준으로 12자는 약 75 bit 수준, 16자는 약 100 bit 수준입니다. 일반 서비스는 12자 이상, 이메일·금융 같은 핵심 계정은 16자 이상을 권장합니다. 위 표에서 길이별 값을 직접 비교해 보세요.

왜 I, O, l, 0, 1 같은 문자가 기본으로 빠지나요?

글꼴에 따라 대문자 I, 소문자 l, 숫자 1이 거의 같아 보이고 O와 0도 헷갈립니다. 직접 입력할 일이 많은 비밀번호에서 오타를 줄이려는 기본값이며, 체크를 해제하면 전체 문자(풀 크기 80개)에서 뽑습니다. 풀이 약간 줄어들어도 길이를 한두 글자 늘리면 충분히 보충됩니다.

Math.random()으로 만든 비밀번호와 무엇이 다른가요?

Math.random()은 통계적 균일성을 위한 함수로, 보안용으로 설계되지 않았고 내부 상태를 관찰하면 다음 값을 예측할 수 있는 구현이 많습니다. crypto.getRandomValues()는 운영체제의 보안 난수원을 사용해 예측이 현실적으로 불가능하도록 설계된 API입니다.

같은 비밀번호를 여러 사이트에 써도 충분히 길면 괜찮나요?

안 됩니다. 길이는 무차별 대입 공격을 막아 줄 뿐, 한 사이트에서 평문이나 약한 해시로 유출되면 그 값이 그대로 다른 사이트에 대입됩니다. 길이와 별개로 사이트마다 다른 비밀번호를 써야 합니다.

비밀번호를 얼마나 자주 바꿔야 하나요?

무작위로 충분히 길게 만들고 다른 곳과 겹치지 않는다면 정기 변경은 필수가 아닙니다. 유출 알림을 받았거나, 공용 PC에서 로그인했거나, 기기를 분실했을 때 즉시 바꾸는 것이 효과적입니다. 다만 회사·기관 정책이 변경 주기를 정해 두었다면 그 정책을 따르세요.

이 글은 일반적인 정보 제공 목적이며, 조직의 보안 정책이나 전문가 상담을 대체하지 않습니다.