서비스 설정에 넣는 비밀값 — 세션 서명 키, API 토큰, 초기 비밀번호, Ory Hydra 의 secrets.system, Keycloak 의 DB 비밀번호 — 는 사람이 지어내지 않고 운영체제의 암호학적 난수원에서 뽑는다. Linux 의 /dev/urandom(과 getrandom() 시스템 콜)이 그 난수원이고[1], 아래 도구는 모두 이것을 읽는다. $RANDOM · date +%s · 언어의 일반 random() 은 예측 가능하므로 비밀값에 쓰지 않는다.
키 길이는 용도에 맞춘다. 대칭키 · HMAC 키 · 세션 시크릿은 32바이트(256비트)면 충분하다. 사람이 입력할 비밀번호는 20자 이상을 권한다.
가장 흔한 방법이다. OpenSSL 의 CSPRNG 을 쓴다[2].
# 32바이트를 16진수로 (64자)
openssl rand -hex 32
# 32바이트를 base64 로 (44자)
openssl rand -base64 32
# 파일로 저장
openssl rand -out secret.key 32
base64 출력에는 / + = 이 들어간다. URL · 설정 파일에서 문제가 되면 -hex 를 쓴다.
openssl 이 없는 최소 환경에서 쓴다.
# 32바이트를 16진수로
head -c 32 /dev/urandom | od -An -tx1 | tr -d ' \n'; echo
# 32바이트를 base64 로
head -c 32 /dev/urandom | base64
# 영숫자만 24자 — 사람이 입력할 비밀번호
tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 24; echo
head /dev/urandom | sha256sum 처럼 난수를 해시로 한 번 더 거르는 방법도 결과는 같은 강도다. 다만 해시는 난수를 더 좋게 만들지 않으므로 굳이 거칠 이유는 없다.
| 도구 | 명령 | 비고 |
|---|---|---|
| Python[3] | python3 -c 'import secrets; print(secrets.token_hex(32))' |
token_urlsafe(32) 는 URL 안전 base64 |
| uuidgen | uuidgen |
122비트. 식별자용. 비밀값으로는 32바이트 난수가 낫다 |
| pwgen | pwgen -s 24 1 |
사람이 읽을 비밀번호. 패키지 설치 필요 |
| ssh-keygen[4] | ssh-keygen -t ed25519 -f id_ed25519 |
비대칭 키 쌍. SSH 키 쌍 |
| openssl genpkey[5] | openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 |
인증서용 비대칭 키. CA 인증서 생성 |
| wg | wg genkey \| tee privatekey \| wg pubkey > publickey |
WireGuard 키 쌍 |
| openvpn | openvpn --genkey secret ta.key |
OpenVPN tls-crypt 정적 키 |
생성한 값이 정말 난수원에서 왔는지는 확인할 방법이 없다. 대신 다음을 확인한다.
-hex 32 는 64자, -base64 32 는 44자.chmod 600.random(4) — Linux kernel random number source devices. 2026-09-20 확인. https://man7.org/linux/man-pages/man4/random.4.html · RFC 4086 Randomness Requirements for Security https://www.rfc-editor.org/rfc/rfc4086.html ↩︎
openssl-rand(1). 2026-09-20 확인. https://docs.openssl.org/master/man1/openssl-rand/ ↩︎
Python secrets — Generate secure random numbers for managing secrets. 2026-09-20 확인. https://docs.python.org/3/library/secrets.html ↩︎
ssh-keygen(1). 2026-09-20 확인. https://man.openbsd.org/ssh-keygen ↩︎
openssl-genpkey(1). 2026-09-20 확인. https://docs.openssl.org/master/man1/openssl-genpkey/ ↩︎