비밀번호 생성기

암호학적으로 안전 // v1.0

설정

범위: 4-64

범위: 1-10

문자 집합
출력_버퍼

입력 대기 중...

랜덤 비밀번호 생성기란?

랜덤 비밀번호 생성기는 허용된 문자 집합에서 균일하게 무작위로 문자를 뽑아 비밀번호를 만듭니다. RandomHub은 브라우저의 암호학적으로 안전한 Web Crypto API(window.crypto.getRandomValues)와 거부 표집(rejection sampling)을 사용해 모듈로 편향(modulo bias)을 피합니다 — 주요 비밀번호 관리자가 의지하는 것과 동일한 난수 소스입니다. 길이(4~64자), 사용할 문자 집합(대문자·소문자·숫자·기호), 시각적으로 헷갈리는 문자(l, 1, I, O, 0) 제외 여부 — 모두 사용자가 정합니다. 생성은 전부 브라우저 안에서 끝납니다. 네트워크에 아무것도 보내지 않고, 어디에도 로그를 남기지 않습니다.

누구에게 맞는 도구인가

🔐

프라이버시를 중시하는 사용자

자신의 자격 증명은 본인이 관리하는 쪽. "믿어 주세요"라는 블랙박스 대신 클라이언트에서 동작하고 검증할 수 있는 생성기를 원하는 사람.

🛠️

IT·시스템 관리자

서비스 계정 생성, SSH 키 패스프레이즈, DB 시드, 신규 입사자용 일회성 자격 증명. 64자 상한이라면 풀-엔트로피 키를 빼면 거의 모두 커버합니다.

👨‍💻

개발자

개발 환경용 일회성 시크릿, 테스트 픽스처, 인증 흐름 모킹, 샘플 데이터 — `pwgen`이나 `openssl rand`보다 브라우저 탭이 빠른 순간을 위한 도구.

👨‍👩‍👧

학부모

강한 비밀번호를 처음 외워야 하는 아이의 계정을 만드는 상황. 헷갈리는 문자를 제외하고 생성하면, 소리 내어 읽고 그대로 입력해도 헷갈리지 않습니다.

🧰

셀프 호스트 사용자

Vaultwarden, Nextcloud, Postgres, 관리자 패널을 직접 띄우는 동안 매니저를 연결하기 전에 새 자격 증명이 필요할 때. 생성하고 붙여 넣고 다음 단계로.

🧑‍💼

관리자 내장 생성기가 답답할 때

일부 관리자는 생성기를 메뉴 안쪽이나 확장 프로그램에 숨겨 놓아, 정작 가입 순간에 잘 동작하지 않습니다. 신뢰할 수 있는 독립 도구가 그 마찰을 정확히 그 순간 없애 줍니다.

이 비밀번호 생성기를 쓰는 이유

01

암호학적 난수 소스

바이트는 window.crypto.getRandomValues에서 가져옵니다 — 1Password, Bitwarden, 현대 브라우저의 자체 생성기가 사용하는 같은 Web Crypto API입니다. 파이프라인 어디에도 Math.random을 쓰지 않습니다.

02

모듈로 편향 없음

나이브하게 `random % poolSize`를 쓰면 풀 크기가 난수 소스를 정확히 나누지 못할 때 낮은 인덱스 쪽으로 살짝 치우칩니다. Uint32에 대해 거부 표집을 적용해 각 문자가 동일한 확률로 나오도록 합니다.

03

실제 비트로 표현되는 강도 미터

엔트로피 = 길이 × log₂(풀 크기), 교과서 공식 그대로입니다. 단계: 약함 <40, 보통 40~63, 강함 64~95, 요새급 96+. 설정이 목표에 도달했는지 즉시 확인할 수 있습니다.

04

브라우저 안에서 모든 것

생성 시점에 어떤 네트워크 요청도 발생하지 않습니다. 로그·저장·전송·분석 모두 하지 않습니다. DevTools를 열고 생성을 눌러 보면 Network 탭은 조용한 그대로입니다.

대표 시나리오와 예시

뱅킹 사이트용 새 비밀번호

기호를 받지 않는 은행이나 공공 서비스에 가입하는 상황. 길이 20, 대문자/소문자/숫자만 활성화, 기호는 비활성, 헷갈리는 문자는 제외 — 인쇄된 영수증에서도 읽기 쉬움.

설정: 길이 20, 대문자+소문자+숫자, 헷갈리는 문자 제외. 예: "Tyek5JWXcbgjLE2EH3vk" — 20 × log₂(58) ≈ 117비트, 요새급에 안정적으로 진입한 영숫자.

SSH 키 패스프레이즈

개인키에 매일 한 번 정도 외워서 입력해야 하는 패스프레이즈가 필요한 상황. 길이 24, 전체 집합, 헷갈리는 문자 포함 — 높은 엔트로피와 가독성. 생성한 뒤에는 비밀번호 관리자에 저장하고 더 이상 외우려 하지 마세요.

설정: 길이 24, 모든 집합, 헷갈리는 문자 제외 끔. 예: "K9$mZ#7vTq!4nL@8pR2&yX#W" — 24 × log₂(76) ≈ 150비트. 보호 대상인 키보다 더 오래 살아남을 강도.

일회성 테스트 계정

개발 중 잠시 쓰고 버릴 계정용 비밀번호. 길이 12, 소문자 + 숫자면 충분 — 한 시간 안에 삭제될 계정.

설정: 길이 12, 소문자+숫자만. 예: "k7vmqr3z9fnp" — 12 × log₂(36) ≈ 62비트. 보통 등급, 60분짜리 일회용에 딱 알맞음.

공유 키오스크에서 소리 내어 전달할 비밀번호

한 사람이 읽고 다른 사람이 입력하는 상황. 헷갈리는 문자(소문자 l, 대문자 I, 숫자 1, 대문자 O, 숫자 0)를 제외하면 가장 흔한 전달 오류가 사라집니다.

설정: 길이 16, 대문자+소문자+숫자, 헷갈리는 문자 제외 켬. 예: "RvkP4hgWmFu82tNz" — 16 × log₂(58) ≈ 94비트. 요새급에 매우 가깝고, 시끄러운 공간에서도 분명히 들립니다.

사용 방법

  1. 1.

    길이 정하기

    4~64자. 대부분 계정에는 16이 든든한 기본값; SSH 패스프레이즈나 셀프 호스트 root 계정에는 24자 이상.

  2. 2.

    문자 집합 고르기

    대문자·소문자·숫자·기호를 켜고 끔. 활성화된 집합이 늘수록 풀이 넓어지고 문자당 엔트로피가 올라갑니다. 결과에는 활성화된 집합마다 최소 한 글자가 보장됩니다.

  3. 3.

    헷갈리는 문자 처리

    꺼짐(기본): l, 1, I, O, 0을 풀에 남겨 둠 — 엔트로피가 약간 더 높습니다. 켜짐: 걸러 냄 — 비밀번호를 소리 내어 읽거나 손으로 옮기기 쉬워집니다.

  4. 4.

    생성 후 복사

    생성 버튼 또는 Enter. 비밀번호마다 자체 복사 버튼이 있고, "모두 복사"는 한 번에 1~10개를 다루는 다중 생성용입니다. 공공장소에서는 "표시/숨김"으로 어깨 너머 보기를 막을 수 있습니다.

자주 묻는 질문

이 비밀번호 생성기는 정말 안전한가요?

난수는 window.crypto.getRandomValues에서 가져옵니다 — 1Password, Bitwarden, 현대 브라우저가 자체 생성기에서 사용하는 같은 Web Crypto API입니다. 거부 표집으로 모듈로 편향을 제거합니다. 생성은 완전히 클라이언트에서 일어납니다 — DevTools를 열고 생성을 누르면 네트워크 트래픽이 없다는 사실을 직접 확인할 수 있습니다.

"모듈로 편향"이 무엇이고 왜 중요한가요?

나이브한 방식은 32비트 난수를 만든 다음 `n % poolSize`를 적용합니다. 풀 크기가 2³²을 정확히 나누지 못하면 일부 위치가 다른 위치보다 약간 더 자주 나오게 됩니다. 비밀번호에서는 이것이 곧 엔트로피의 누수입니다. RandomHub은 불균형한 꼬리 영역에 빠진 표본을 버리고 다시 뽑아, 모든 문자가 동일 확률을 유지하게 합니다.

비트 강도는 어떻게 계산되나요?

엔트로피 = 길이 × log₂(풀 크기). 16자에 소문자+숫자만이면 16 × log₂(36) ≈ 83비트. 같은 16자에 네 집합 모두 사용하고 헷갈리는 문자 필터를 끄면 16 × log₂(94) ≈ 105비트. 임계: 약함 <40, 보통 40~63, 강함 64~95, 요새급 96+.

왜 헷갈리는 문자를 제외하나요?

l, 1, I, O, 0은 많은 글꼴에서 시각적으로 비슷합니다. 비밀번호를 소리 내어 읽거나 종이에 옮기거나 전화로 불러 주거나 키오스크 화면에 띄울 때 필터가 도움이 됩니다. 비용은 풀이 약간 작아져 문자당 엔트로피가 조금 줄어드는 것 — 대부분 상황에서 충분히 가치 있는 거래입니다.

비밀번호가 저장되거나 어디로 전송되나요?

아니요. 생성은 브라우저의 JavaScript에서 일어납니다. 페이지는 생성 버튼을 눌러도 네트워크 요청을 보내지 않습니다. 어떤 것도 로깅·저장·전송·분석되지 않습니다. 이후 요청을 받아도 생성된 비밀번호를 복원할 수 없습니다 — 어디에도 흔적이 남지 않기 때문입니다.

왜 최소 길이가 8이 아니라 4인가요?

일반 계정은 12자 이상이 좋습니다. 4자 최소를 둔 이유는, 도어 코드, 앱 PIN, 교실 게임처럼 짧은 숫자나 문자열이 의도된 정당한 "PIN 스타일" 용도가 있기 때문입니다. 엔트로피가 낮으면 강도 미터가 곧바로 경고합니다.

"기호"를 켜면 어떤 기호가 포함되나요?

집합은 `!@#$%^&*()-_=+[]{};:,.<>?/` — 26자입니다. 폼 검증을 자주 깨뜨리는 문자(역슬래시, 작은따옴표, 큰따옴표, 백틱, 공백)는 의도적으로 제외해, 가능한 많은 가입 폼에서 그대로 동작하도록 했습니다.

"correct horse battery staple" 같은 패스프레이즈를 만들 수 있나요?

현재는 만들 수 없습니다 — RandomHub은 문자 단위 비밀번호를 생성합니다. Diceware 스타일 패스프레이즈는 큐레이션된 단어 리스트가 필요한 별도 도구입니다. 별도 페이지로 추가할 가치가 있다면 별도 페이지로 제공할 예정입니다.

강한 랜덤 비밀번호에 대해

비밀번호의 무차별 대입 저항력은 비트로 표현된 엔트로피에 대해 지수적으로 증가합니다. 인쇄 가능한 ASCII 94자 중에서 12자를 뽑은 비밀번호는 약 79비트 — 해시가 적절히 늘려져 있다면 합리적인 하드웨어 예산을 가진 오프라인 공격자가 이미 깨기 어려운 영역입니다. 16자는 약 105비트, 24자는 약 158비트로, AES-128의 실용적 보안 수준을 훌쩍 넘습니다. 지난 10년간 비밀번호 연구가 알려 준 교훈은 분명합니다 — 길이가 문자 클래스 다양성보다 효과가 큽니다. 10자에 기호를 더하는 것보다, 같은 비밀번호를 더 작은 클래스로 14자까지 늘리는 편이 더 강해집니다. RandomHub의 기본값(길이 16, 네 집합 모두 활성, 헷갈리는 문자 필터 없음)은 대부분의 위협 모델에서 요새급 영역에 여유 있게 안착합니다. 도구는 의도적으로 좁게 설계했습니다 — 암호학적 난수, 길이와 집합의 자유로운 조정, 정직한 엔트로피 미터, 그 외에는 두지 않았습니다. "브라우저 밖으로 나가지 않는다"는 약속을 깨지 않으면서 흐름을 분명히 개선할 수 있는 기능이 있다면 알려 주세요.