8개의 숫자를 3가지 문자로 바꾸면 횟수가 달라집니다

0부터 7까지의 정수가 같은 확률로 나온다고 가정하고, 3으로 나눈 나머지를 문자 번호로 사용해 봅니다. 나머지 0과 1은 각각 세 번, 나머지 2는 두 번 나타납니다. 원래 숫자가 균등해도 나머지 결과는 균등하지 않습니다. 이것이 이 예제의 나머지 편향입니다.

0 % 3 = 0    1 % 3 = 1    2 % 3 = 2
3 % 3 = 0    4 % 3 = 1    5 % 3 = 2
6 % 3 = 0    7 % 3 = 1
// counts: [3, 3, 2]

마지막 두 숫자를 거절하면 같은 횟수가 됩니다

이 작은 예제에서 6과 7을 거절하고 다시 뽑으면, 허용한 0부터 5의 나머지는 각각 두 번씩 나타납니다. 균등한 원래 숫자라는 가정 아래 허용 범위에서 편향을 없애는 방법입니다. 다시 뽑는 과정은 숫자를 반복해서 재사용하는 것이 아닙니다.

0부터 7을 3으로 나눈 나머지 횟수 3 3 2와, 6과 7을 거절한 뒤의 횟수 2 2 2 비교
직접 계산한 작은 예제의 빈도 도식입니다. 왼쪽은 0~7 전체, 오른쪽은 0~5만 허용한 결과입니다. 브라우저 난수의 실측 분포가 아닙니다.

Moyoutil의 randomInt 함수는 Uint32Array(1)에 crypto.getRandomValues로 숫자를 받고, 2^32를 선택지 수로 나눈 몫을 내림해 다시 선택지 수를 곱한 경계를 사용합니다. 경계 이상의 숫자는 거절하고 다시 뽑습니다. 선택지가 3개라면 경계는 4,294,967,295이고, 최대 값 하나를 거절합니다.

Math.floor(4294967296 / 3) * 3
// 4294967295
// accept: 0 through 4294967294
// reject: 4294967295

W3C Web Cryptography: getRandomValues

Web Cryptography 문서는 getRandomValues가 암호학적으로 강한 난수를 생성하도록 규정합니다. 이 글의 검증은 프로젝트 코드가 거절 경계를 처리하는지 확인한 것이며, 운영체제의 엔트로피나 특정 브라우저 난수 구현을 감사한 것은 아닙니다.

문자 종류 보장은 각 자리의 독립 선택과 다릅니다

현재 도구는 선택한 각 문자 종류에서 먼저 한 글자씩 뽑고, 남은 자리를 선택한 문자 전체에서 채운 뒤 순서를 섞습니다. 따라서 선택한 종류는 최소 한 번 포함됩니다. 전부 대문자를 선택한 경우와 네 종류를 선택한 경우는 같은 생성 조건이 아닙니다. 문자 종류 보장만으로 비밀번호의 안전성을 보장하거나 단순한 경우의 수를 실제 추측 시간으로 바꿀 수는 없습니다.

길이는 4~128의 정수, 문자 종류는 하나 이상이어야 합니다. 소수 길이, 범위를 벗어난 길이, 모든 종류를 해제한 입력은 오류입니다. 4자를 받을 수 있다는 사실은 안전한 최소 길이가 4자라는 뜻이 아닙니다. NIST SP 800-63B-4는 적용 대상 검증자에게 단일 요소 비밀번호 인증의 최소 15자, 다중 요소 인증의 일부로 쓰이는 비밀번호의 최소 8자를 요구합니다. 모든 웹사이트의 공통 입력 규칙이라는 뜻은 아닙니다.

NIST SP 800-63B-4: 비밀번호 검증자 요구사항

생성 후 보관과 화면 지우기를 구분하세요

  1. 사용할 서비스의 허용 길이와 문자 조건을 확인합니다. Moyoutil 기본 길이는 20이며 길이와 종류를 조절할 수 있습니다.
  2. 새 비밀번호 생성을 눌러 현재 설정의 결과를 만듭니다. 설정이 바뀌면 이전 결과는 지워지고 복사가 비활성화되므로 다시 생성합니다.
  3. 사이트마다 다른 비밀번호를 사용하고 비밀번호 관리자에 보관합니다. 이 도구는 비밀번호 보관함이나 서비스 로그인 기능을 제공하지 않습니다.
  4. 화면 결과 지우기는 화면을 비우지만 복사한 클립보드 내용까지 삭제하지 않습니다. 클립보드와 공유 기기의 상태를 별도로 확인합니다.

NIST SP 800-63B-4: 비밀번호 관리자와 서비스별 비밀번호

현재 생성 결과는 도구 서버로 전송하거나 저장하지 않습니다. 그러나 입력과 클립보드를 읽는 확장 프로그램, 공유 기기, 계정의 피싱 피해까지 차단하는 기능은 아닙니다. 게시된 예제 문자열을 실제 계정 비밀번호로 사용하지 마세요.

자주 묻는 질문

특수문자를 모두 선택해야 안전한가요?

문자 종류만으로 안전성을 판단할 수 없습니다. 사용 서비스의 조건, 충분한 길이, 서비스마다 다른 값과 안전한 보관을 함께 확인하세요.

이 글이 브라우저 난수 품질을 검증한 것인가요?

아닙니다. 작은 범위를 모두 계산하고 프로젝트 함수의 거절 경계를 재현했습니다. 특정 브라우저의 엔트로피나 비밀번호 해독 시간을 측정하지 않았습니다.