사용 방법
- ‘길이’를 설정하고, ‘단위’에서 ‘무작위 데이터 바이트 수’와 ‘문자 수’ 중 하나를 고릅니다. 키를 만들 때는 바이트 단위를 사용하십시오. 32바이트가 256비트 키입니다.
- 필요한 문자열의 ‘개수’와 문자열 사이에 넣을 ‘구분자’를 ‘줄 바꿈’, ‘쉼표’, ‘공백’ 중에서 설정합니다.
- ‘변형’에서 ‘표준(RFC 4648)’ 또는 ‘URL 안전(RFC 4648 §5)’을 선택합니다. 바이트 단위에서는 대상 시스템이 = 기호를 기대하지 않을 때 ‘패딩’을 끌 수도 있습니다.
- ‘생성’을 클릭해 새 값을 만든 다음 ‘모두 복사’로 복사하거나 ‘다운로드’로 목록을 저장합니다.
바이트, 문자, 엔트로피
무작위 문자열의 강도는 엔트로피 비트 수로 측정합니다. 무작위 바이트 하나마다 8비트가 더해지므로 16바이트는 128비트, 32바이트는 256비트입니다. Base64는 이 바이트를 표기하는 방식만 바꿀 뿐입니다. 문자 하나가 6비트를 담고, 3바이트가 4문자가 됩니다. 이 도구는 문자열마다 엔트로피를 표시하므로 한눈에 확인할 수 있습니다.
바이트 단위를 선택하면 출력을 디코딩했을 때 정확히 지정한 개수의 무작위 바이트가 나오며, 키와 비밀 값에는 바로 이것이 필요합니다. 문자 단위를 선택하면 정확한 개수의 문자를 얻고, 각 문자는 64자 알파벳에서 균등한 확률로 선택됩니다. 시스템이 고정 길이의 토큰을 요구하고 이를 텍스트로 저장할 때 사용하십시오.
| 바이트 | Base64 문자 수 | 엔트로피 | 주요 용도 |
|---|---|---|---|
| 12 | 16 | 96비트 | AES-GCM nonce(IV) |
| 16 | 24(패딩 없이 22) | 128비트 | 솔트, 세션 토큰과 CSRF 토큰, AES-128 키 |
| 32 | 44(패딩 없이 43) | 256비트 | AES-256 키와 HMAC-SHA256 키, HS256 비밀 키, API 키 |
| 64 | 88(패딩 없이 86) | 512비트 | HMAC-SHA512 키, HS512 비밀 키 |
무작위 Base64 값이 쓰이는 곳
- JWT 비밀 키. RFC 7518은 HMAC 키가 해시 출력 이상의 길이여야 한다고 규정합니다. HS256은 32바이트, HS384는 48바이트, HS512는 64바이트입니다. 비밀 키 문자열을 그대로 쓰는 라이브러리도 있고 먼저 Base64로 디코딩하는 라이브러리도 있으므로, 사용하는 라이브러리가 어느 쪽을 기대하는지 확인하십시오. JWT 디코더는 두 종류의 비밀 키 모두로 HS256~HS512 서명을 검증하며, HMAC 생성기는 키를 텍스트, 16진수, Base64로 입력받습니다.
- 애플리케이션 키. 예를 들어 Laravel은 32바이트 암호화 키를
.env파일에APP_KEY=base64:...형태로 보관합니다. 이 도구로 만든 32바이트 문자열과 같은 형식입니다. - Kubernetes Secret.
data아래의 값은 패딩이 있는 표준 Base64여야 합니다. 바이트 단위와 표준 변형으로 패딩을 켠 채 생성한 문자열은 그대로 넣을 수 있으며, Pod는 원시 무작위 바이트를 받게 됩니다. 애플리케이션이 Base64 텍스트 자체를 기대한다면 대신stringData아래에 넣으십시오. - URL에 들어가는 토큰. 비밀번호 재설정 링크, 초대 코드처럼 URL로 전달되는 토큰에는 URL 안전 변형을 사용해야 합니다. 이 변형은
+,/문자를-,_문자로 바꿉니다. 자세한 내용은 Base64URL 페이지를 참고하십시오.
Math.random 대신 crypto.getRandomValues를 쓰는 이유
Math.random()은 빠른 범용 난수 생성기입니다. 출력이 예측 불가능하도록 설계되지 않았으며, 일부 엔진에서는 값 몇 개만으로 내부 상태를 복원할 수 있습니다. 이 도구는 운영 체제가 시드를 제공하는 암호학적으로 안전한 생성기인 crypto.getRandomValues()를 사용합니다. openssl rand와 Python secrets 모듈의 바탕이 되는 것과 같은 종류의 난수원입니다. 값은 사용자의 기기에서 생성되며 전송되거나 저장되지 않습니다.
코드에서 무작위 Base64 생성하기
# 셸: 무작위 32바이트를 Base64로(44자)
openssl rand -base64 32
head -c 32 /dev/urandom | base64
# Python
import base64, secrets
base64.b64encode(secrets.token_bytes(32)).decode()
secrets.token_urlsafe(32) # URL 안전, 패딩 없음, 43자
// Node.js
const crypto = require('crypto');
crypto.randomBytes(32).toString('base64');
crypto.randomBytes(32).toString('base64url'); // URL 안전, 패딩 없음
// 브라우저
const bytes = crypto.getRandomValues(new Uint8Array(32));
btoa(String.fromCharCode(...bytes));
자주 묻는 질문
무작위 키나 비밀 값은 얼마나 길어야 합니까?
세션 ID, CSRF 토큰, 솔트처럼 고유하고 추측할 수 없기만 하면 되는 값에는 16바이트(128비트)면 충분합니다. AES-256 키, HMAC-SHA256 키, HS256 비밀 키에는 32바이트(256비트)를, HMAC-SHA512와 HS512에는 64바이트를 사용하십시오.
openssl rand -base64 32와 같은 결과입니까?
= 하나로 끝나며, 디코딩하면 무작위 32바이트가 됩니다. 물론 값 자체는 매번 다릅니다.바이트 단위와 문자 단위 중 무엇을 써야 합니까?
암호화 키나 Kubernetes Secret처럼 문자열을 디코딩해서 쓸 때는 바이트 단위를 사용하십시오. 시스템이 정확한 길이의 토큰을 요구하고 텍스트를 그대로 사용할 때는 문자 단위를 사용하십시오. 문자 단위로 만든 문자열은 길이가 4의 배수일 때만 문제없이 디코딩된다고 보장할 수 있습니다.
URL 안전 변형은 언제 필요합니까?
/는 URL 경로를 나누고, +는 폼 인코딩된 쿼리 문자열에서 공백으로 바뀝니다. URL 안전 Base64는 대신 -, _ 문자를 사용하며 보통 패딩 없이 씁니다.생성된 값이 어딘가에 저장되거나 전송됩니까?
아니요. 값은 브라우저의 JavaScript로 생성되며, 전송되지 않고 페이지를 떠나면 사라집니다. 생성한 값을 실제 비밀 값으로 쓰게 되면 채팅 메시지나 티켓에 남기지 말고 비밀번호 관리자나 시크릿 저장소에 보관하십시오.