복잡함보다 길이
비밀번호에 관해 대부분이 익힌 조언, 특수문자를 섞어라, o를 0으로 바꿔라, 90일마다 변경하라, 은 사람이 외우기는 어렵게 만들면서 기계가 알아내기는 그다지 어렵게 만들지 못하는 것으로 드러났습니다. NIST를 비롯한 현재의 권고는 반대 방향을 가리킵니다. 중요한 것은 길이이며, 강제된 복잡성 규칙은 대체로 예측 가능한 치환만 만들어 냅니다.
이 생성기는 브라우저의 암호학적 난수원을 사용하며, 길이와 문자 종류를 직접 지정할 수 있습니다.
비밀번호 생성하는 방법
길이를 먼저 정하세요. 일의 대부분을 해내는 입력입니다.
- 길이를 정하세요. 중요한 계정이라면 16자가 무난한 기본값이며, 비밀번호 관리자가 대신 기억해 준다면 더 길어도 비용이 들지 않습니다.
- 문자 종류를 고르세요. 대문자, 소문자, 숫자, 기호이며 넷 다 켜면 후보 집합이 가장 넓어집니다.
- 강도 표시를 확인하세요. 길이와 켜 놓은 종류 수를 함께 반영합니다.
- 결과를 복사해 비밀번호 관리자에 넣으세요. 다시 타이핑할 곳에 두지 마세요.
- 계정마다 새로 만드세요. 재사용이야말로 한 사이트의 유출을 모든 곳의 문제로 바꾸는 요인입니다.
- 사이트가 기호를 거부할 때만 기호를 끄고, 대신 길이를 늘려 보완하세요.
난수는 어디서 오는가
이 생성기는 `Math.random`이 아니라 브라우저의 암호학적 안전 난수원인 `crypto.getRandomValues`에서 값을 얻습니다. 이 구분은 중요합니다. `Math.random`은 빠르고 통계적으로 고르도록 설계되었을 뿐 예측 불가능하도록 만들어진 것이 아니며, 원리적으로는 이전 출력으로부터 재구성될 수 있습니다. 여기서 만들어지는 어떤 값도 시각이나 페이지, 관찰자가 재현할 수 있는 무언가에서 파생되지 않습니다.
네 종류를 모두 켜면 후보 집합은 91자이고, 한 글자당 약 6.5비트의 엔트로피에 해당합니다. 따라서 16자는 대략 104비트로, 어떤 현실적 규모의 오프라인 무차별 대입도 닿지 못하는 수준입니다. 비밀번호에 실질적인 위협은 피싱, 재사용, 데이터베이스 유출이며, 엔트로피를 더 늘려도 이들 중 어느 것도 막아 주지 못합니다.
길이와 문자 종류별 엔트로피
대략적인 엔트로피 비트 값이며, 비밀번호를 정직하게 비교하는 방법입니다.
| 길이 | 소문자만 | 영문 + 숫자 | 네 종류 모두 |
|---|---|---|---|
| 8자 | 약 38비트 | 약 48비트 | 약 52비트 |
| 12자 | 약 56비트 | 약 71비트 | 약 78비트 |
| 16자 | 약 75비트 | 약 95비트 | 약 104비트 |
| 20자 | 약 94비트 | 약 119비트 | 약 130비트 |
| 24자 | 약 113비트 | 약 143비트 | 약 156비트 |
| 32자 | 약 150비트 | 약 190비트 | 약 208비트 |
소문자 비밀번호에 네 글자를 더하는 것이, 짧은 비밀번호에 키보드의 모든 기호를 더하는 것보다 이득입니다. 소문자 12자가 네 종류를 모두 쓴 8자를 이깁니다. 복잡함보다 길이라는 주장 전체가 이 한 줄에 담겨 있습니다.
강한 비밀번호가 막아 주지 못하는 것
엔트로피는 추측을 막아 주는데, 대부분의 계정은 추측으로 털리지 않습니다. 피싱은 입력하는 순간 비밀번호를 가져가고, 크리덴셜 스터핑은 사이트 간 재사용을 파고들며, 서비스 쪽 유출은 그들이 저장한 것을 강도와 무관하게 노출시킵니다. 이중 인증은 앞의 두 가지를 어떤 길이로도 할 수 없는 방식으로 다룹니다.
모든 처리는 브라우저에서 이루어집니다. 아무것도 전송되지 않고 생성된 비밀번호는 저장되거나 기록되지 않습니다. 다만 어떤 웹 페이지에서든 비밀번호를 만든다는 것은 그 페이지를 신뢰한다는 뜻입니다. 가장 값나가는 자격 증명이라면, 그러니까 비밀번호 관리자의 마스터 비밀번호나 복구 키라면, 이미 신뢰하는 관리자에 내장된 생성기를 쓰는 편이 더 보수적인 선택입니다.