비밀번호 생성기
원하는 길이와 숫자·기호 포함 여부를 정해 브라우저에서 안전한 무작위 비밀번호를 생성합니다.
브라우저 난수로 한 글자씩 뽑는다
이 생성기는 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제곱대까지 떨어집니다. 짧고 복잡한 값보다 길고 단순한 값이 대체로 더 강합니다.
만들고 난 다음이 더 중요하다
옵션 이름은 포함이지만 실제로는 후보에 넣는다는 뜻입니다. 길이가 짧으면 숫자나 기호가 한 글자도 안 나올 수 있어, 두 종류를 반드시 요구하는 사이트에서는 결과를 보고 조건에 맞는지 확인하거나 버튼을 다시 눌러 새로 뽑아야 합니다.
만들어진 값은 화면에만 있고 어디에도 기록되지 않으므로 페이지를 닫으면 되찾을 방법이 없습니다. 복사 버튼으로 옮긴 뒤 비밀번호 관리자에 곧바로 넣어 두세요. 메모장이나 메신저 대화방에 적어 두면 애써 만든 무작위성이 헛수고가 됩니다.
자주 묻는 질문
같은 값이 두 번 나올 수도 있나요?
이론상 가능하지만 20자라면 사실상 일어나지 않습니다. 누를 때마다 새로 난수를 뽑고 이전 결과를 기억하지 않는데도 겹칠 확률은 무시할 수준입니다.
특수문자를 안 받는 사이트에서는 어떻게 하나요?
기호 체크를 끄고 대신 길이를 늘리면 됩니다. 후보가 57종으로 줄어도 24자면 기호를 넣은 16자보다 조합의 크기가 오히려 큽니다. 길이 제한이 걸려 있다면 허용하는 최대치로 잡으세요.
몇 자로 만드는 게 적당한가요?
중요한 계정은 16자 이상을 권합니다. 이 도구는 8자부터 128자까지 받는데, 관리자에 저장해 쓸 거라면 길어도 불편하지 않으니 20자 안팎을 기본으로 잡으세요.
외우기 쉬운 형태로 만들 수는 없나요?
여기서는 무작위 글자만 뽑습니다. 머리로 기억해야 한다면 서로 관련 없는 단어 네댓 개를 이어 붙이는 방식이 외우기에도 지키기에도 낫습니다. 사이트마다 다른 값을 쓴다는 원칙은 그대로입니다.
복사 버튼을 눌렀는데 붙여넣기가 안 됩니다
브라우저가 클립보드 접근을 막았을 수 있습니다. 그럴 때는 표시된 값을 직접 드래그해 옮기면 되고, 버튼 문구가 복사됨으로 바뀌었는지도 살펴보세요.