강력한 비밀번호, 외우기 쉬운 패스프레이즈, API 키, PIN을 만듭니다. 강도는 모호한 색상 막대가 아니라 실제 엔트로피 비트 수로 보여줍니다. 모든 값은 브라우저의 암호학적 난수 생성기에서 나옵니다.
비밀번호의 강도는 엔트로피 — 공격자가 훑어야 하는 경우의 수 — 로 재고, 엔트로피는 특수문자보다 길이에서 훨씬 많이 나옵니다. 소문자만 쓴 16자 무작위 문자열이 모든 문자 종류를 억지로 넣은 8자보다 엔트로피가 높고, 입력하기도 편합니다.
여기서 쓰는 난수는 Math.random()이 아니라 브라우저의 암호학적 난수원인 crypto.getRandomValues()입니다. Math.random()의 출력은 앞선 값으로부터 예측할 수 있어 비밀에 써서는 안 됩니다. 패스프레이즈 모드는 단어를 조합하는데, 사람이 직접 다시 입력해야 하는 상황이라면 이쪽이 낫습니다. 추정 엔트로피는 비트 단위 숫자로 표시하므로 색깔이 아니라 값으로 판단할 수 있습니다.
문자 구성 규칙은 다양성을 강제하려고 만들어졌지만 실제로는 예측 가능성을 만들어 냅니다. 대문자 하나, 숫자 하나, 기호 하나를 요구하면 사람들은 앞에 대문자, 뒤에 숫자, 그 뒤에 느낌표를 붙이는 쪽으로 몰립니다. 공격자가 그대로 모델링하는 패턴이라, 규칙이 탐색 공간에 더해 주는 것보다 없애는 것이 많습니다. NIST 지침도 여러 해 전부터 구성 규칙을 강제하지 말고 길이와 유출 목록 대조를 쓰라고 권고해 왔습니다. 그래도 요구하는 사이트라면, 규칙을 만족하는 문자열을 직접 지어내는 것보다 규칙에 맞는 무작위 문자열을 생성하는 편이 낫습니다.
중요한 변수는 길이이고, 산수를 보면 이유가 분명합니다. 문자가 하나 늘 때마다 탐색 공간이 알파벳 크기만큼 곱해집니다. 그래서 62자 알파벳에서 문자 하나를 더하는 것이, 짧은 비밀번호의 알파벳에 기호 서른 개를 더하는 것보다 큽니다. 16자 무작위 소문자 문자열의 엔트로피는 약 75비트이고, 출력 가능한 ASCII를 다 쓴 8자 문자열은 약 52비트입니다. 길고 단순한 쪽이 더 강하면서 휴대폰에서 입력하기도 쉽습니다.
사람이 직접 다시 입력해야 하는 경우라면 패스프레이즈를 고르는 편이 좋습니다. 기기 비밀번호, 디스크 암호화 키, 종이에 적어 두는 복구 문구 같은 것들입니다. 서로 관련 없는 단어 몇 개는 실제로 상당한 엔트로피를 갖지만, 조건이 있습니다. 단어를 사람이 고르는 것이 아니라 무작위로 뽑아야 합니다. 사람이 떠올린 구절은 사전이 시사하는 것보다 훨씬 좁은 분포에서 나오기 때문입니다. 여기 표시되는 엔트로피 값은 실제로 사용된 알파벳과 길이로 계산되므로, 패스프레이즈와 무작위 문자열의 비교가 인상이 아니라 숫자로 나옵니다.
아니요. 브라우저의 crypto.getRandomValues에서 나오며 전송되지 않고 저장되지도 않습니다. 새로고침하면 사라집니다.
대략 이렇습니다. 속도 제한과 2단계 인증이 있는 계정이면 60비트로 충분하고, 중요한 것이라면 80비트 이상, 128비트면 무차별 대입을 논할 필요가 없어집니다. 설정에 따른 정확한 값은 강도 표시에 나옵니다.
중복을 금지하면 가능한 조합이 줄어들어 엔트로피가 조금 낮아지고, 길이도 문자 집합 크기를 넘을 수 없게 됩니다. 보안 옵션이 아니라 가독성 옵션입니다.