비밀번호 생성기
원하는 길이와 숫자·기호 포함 여부를 정해 브라우저에서 안전한 무작위 비밀번호를 생성합니다.
길이와 문자 종류별 경우의 수
비밀번호 한 자리에 올 수 있는 문자 수를 길이만큼 거듭제곱한 경우의 수를 2진 자릿수(비트)로 나타냈습니다. 비트가 10 늘 때마다 경우의 수는 약 1,000배가 됩니다.
| 길이 | 숫자만 (10종) | 영문 소문자 (26종) | 영문+숫자 (62종) | 영문+숫자+기호 (94종) |
|---|---|---|---|---|
| 8자 | 27비트 | 38비트 | 48비트 | 52비트 |
| 12자 | 40비트 | 56비트 | 71비트 | 79비트 |
| 16자 | 53비트 | 75비트 | 95비트 | 105비트 |
| 20자 | 66비트 | 94비트 | 119비트 | 131비트 |
이 생성기는 헷갈리기 쉬운 문자(0과 O, 1과 l 등)를 빼서 종류가 표보다 조금 적습니다. 대체로 70비트를 넘으면 무작위 대입으로 뚫기 매우 어렵다고 봅니다.
브라우저 난수로 한 글자씩 뽑는다
이 생성기는 crypto.getRandomValues로 32비트 난수를 받아 후보 문자 가운데 하나를 고르는 일을 길이만큼 반복합니다. 자바스크립트의 Math.random과 달리 암호학적으로 안전한 난수원이라 앞 글자를 알아도 다음 글자를 예측할 수 없습니다.
난수를 후보 개수로 나눈 나머지를 그냥 쓰면 앞쪽 글자가 조금 더 자주 뽑히는 편향이 생깁니다. 그래서 후보 개수의 배수를 넘어서는 값이 나오면 버리고 다시 뽑습니다. 모든 글자가 똑같은 확률로 선택되도록 하는 처리입니다. 눈에 보이지 않지만 결과의 품질을 좌우하는 대목입니다.
0과 O, 1과 l을 빼 둔 후보 문자
바탕이 되는 후보는 영문 대문자에서 I와 O를, 소문자에서 l을 덜어 낸 49자입니다. 손으로 옮겨 적거나 전화로 불러 줄 때 헷갈리기 쉬운 글자를 미리 없앤 것입니다. 숫자 후보에서도 0과 1을 빼고 2부터 9까지 여덟 자만 씁니다.
기호를 켜면 느낌표부터 물음표까지 13자가 더해집니다. 숫자와 기호를 모두 켜면 후보는 70종입니다. 후보를 줄인 만큼 조합은 약간 손해지만 오타로 로그인이 막히는 일이 줄어듭니다.
20자에 70종이면 어느 정도인가
길이 20에 후보 70종이면 가능한 경우의 수는 70의 20제곱, 대략 8 뒤에 0이 서른여섯 개 붙는 크기입니다. 초당 1조 번을 대입해도 전부 훑는 데 걸리는 시간이 우주의 나이를 아득히 넘어섭니다. 무차별 대입으로 뚫는다는 발상 자체가 성립하지 않는 구간입니다.
길이를 깎는 쪽이 후보를 깎는 쪽보다 훨씬 위험합니다. 숫자와 기호를 모두 꺼서 후보가 49종이 되어도 20자라면 10의 33제곱대가 남지만, 후보를 70종으로 둔 채 길이만 8자로 낮추면 10의 14제곱대까지 떨어집니다. 짧고 복잡한 값보다 길고 단순한 값이 대체로 더 강합니다.
복잡한 규칙보다 길이와 재사용 금지가 먼저다
미국 표준기술연구소(NIST)의 디지털 신원 지침 SP 800-63B는 비밀번호 하나로만 로그인하는 계정이라면 최소 15자, 다른 인증 수단과 함께 쓰는 경우에도 최소 8자를 요구합니다. 대문자와 숫자, 기호를 반드시 섞으라는 식의 조합 규칙은 서비스가 강제하지 말라고 하고, 정기적으로 비밀번호를 바꾸게 하는 것도 유출 정황이 없다면 요구하지 말라고 적었습니다. 규칙을 맞추느라 짧고 뻔한 변형을 만드는 것보다 길고 무작위인 값을 오래 쓰는 편이 낫다는 판단입니다.
같은 지침은 서비스가 비밀번호 관리자와 자동 입력을 허용해야 한다고 정합니다. 그러니 이 생성기로 사이트마다 다른 값을 만들어 관리자에 저장하는 방식이 지침과 그대로 맞습니다. 가장 흔한 실수는 잘 만든 값 하나를 여러 곳에 돌려 쓰는 것인데, 한 사이트에서 새면 나머지 계정이 한꺼번에 열립니다. 길이가 짧게 제한된 사이트에서는 숫자나 기호가 한 글자도 안 나올 수 있으니 조건에 맞는지 보고 다시 뽑으세요. 만든 값은 어디에도 남지 않으므로 페이지를 닫기 전에 관리자에 넣어 두어야 합니다. 길이 제한이 있는 칸에 넣기 전에는 글자수 세기로 길이를 확인할 수 있습니다.
자주 묻는 질문
같은 값이 두 번 나올 수도 있나요?
이론상 가능하지만 20자라면 사실상 일어나지 않습니다. 누를 때마다 새로 난수를 뽑고 이전 결과를 기억하지 않는데도 겹칠 확률은 무시할 수준입니다.
특수문자를 안 받는 사이트에서는 어떻게 하나요?
기호 체크를 끄고 대신 길이를 늘리면 됩니다. 후보가 57종으로 줄어도 24자면 기호를 넣은 16자보다 조합의 크기가 오히려 큽니다. 길이 제한이 걸려 있다면 허용하는 최대치로 잡으세요.
몇 자로 만드는 게 적당한가요?
중요한 계정은 16자 이상을 권합니다. 이 도구는 8자부터 128자까지 받는데, 관리자에 저장해 쓸 거라면 길어도 불편하지 않으니 20자 안팎을 기본으로 잡으세요.
외우기 쉬운 형태로 만들 수는 없나요?
여기서는 무작위 글자만 뽑습니다. 머리로 기억해야 한다면 서로 관련 없는 단어 네댓 개를 이어 붙이는 방식이 외우기에도 지키기에도 낫습니다. 사이트마다 다른 값을 쓴다는 원칙은 그대로입니다.
비밀번호를 주기적으로 바꿔야 하나요?
유출 정황이 없다면 날짜를 정해 바꾸는 것보다 처음부터 길고 고유한 값을 쓰는 편이 낫다는 것이 NIST SP 800-63B의 입장입니다. 다만 서비스에서 유출 공지가 오거나 다른 사람이 로그인한 흔적이 보이면 그 즉시 새 값으로 바꿔야 합니다.