랜덤 문자열 생성기
무료로 쓰는 온라인 랜덤 문자열 생성기입니다. 암호학적으로 안전하고 균등하게 분포하며, 서버로는 아무것도 보내지 않습니다.
추가 옵션
이 랜덤 문자열 생성기에 대하여
랜덤 문자열 생성기는 사용자가 고른 문자 집합에서 각 자리의 문자를 무작위로 골라 문자열을 만듭니다. 개발자는 랜덤 문자열을 API 키, 세션 토큰, 비밀번호 재설정 링크, 데이터베이스 식별자, 파일 이름, 초대 코드, 테스트 데이터로 씁니다. 좋은 생성기와 나쁜 생성기를 가르는 것은 무작위성이 어디서 오는지, 그리고 그것이 어떻게 문자로 바뀌는지뿐이며, 둘 다 결과만 봐서는 알 수 없습니다. 무작위처럼 보이는 문자열과 실제로 무작위인 문자열은 다릅니다.
이 랜덤 문자열 생성기는 서버가 아니라 여러분의 브라우저 탭 안에서 온라인으로 동작합니다. 운영체제가 비밀번호 관리자와 TLS 라이브러리에 제공하는 것과 같은 암호학적 난수원을 사용하고, 이를 편향 없이 문자로 바꾸며, 결과에 엔트로피가 얼마나 담겼는지 정확히 알려 줍니다. 무료이고 계정도 필요 없으며, 페이지를 불러온 뒤에는 네트워크 연결을 끊어도 계속 동작합니다.
사용 방법
- 숫자 입력란이나 슬라이더로 길이를 정합니다. 기본값은 24자이고, 슬라이더는 1부터 128까지, 숫자 입력란은 4,096까지 받습니다.
- 문자 집합을 고릅니다. 버튼으로 대문자, 소문자, 숫자, 기호를 켜거나 끌 수 있고, 드롭다운에서는 16진수, Base58, Base32, URL 안전 Base64 같은 준비된 문자 집합을 고를 수 있습니다.
- 생성 버튼이나 G 키를 누릅니다. 새 문자열이 위에 나타나고, 그 아래에 비트 단위의 강도가 표시됩니다.
- 복사를 누릅니다. 값이 여러 개 필요하면 추가 옵션을 열어 최대 10,000까지 개수를 정하고, 한 줄에 하나, 쉼표로 구분, JSON 배열, 따옴표로 묶은 목록,
.env할당문 중에서 고른 뒤 전체를 한꺼번에 복사하거나 다운로드합니다.
특수문자가 들어간 랜덤 문자열
기호 버튼을 켜면 특수문자 12개 ! # $ % * + - = ? @ ^ _가 추가됩니다. 이 조합은 일부러 고른 것입니다. 모두 Microsoft Entra ID, Active Directory, OWASP의 비밀번호 허용 목록에 들어 있고, 백슬래시나 따옴표, 공백처럼 셸 명령, URL, 따옴표로 감싼 설정값을 망가뜨리지도 않습니다. 영문자와 숫자를 합치면 74자짜리 문자 집합이 되어 문자당 6.2095비트이며, 인쇄 가능한 ASCII 문자 94개 전체보다 5.3% 낮을 뿐입니다. 모든 기호나 다른 조합이 필요하면 사용자 지정 문자 집합 입력란에 원하는 문자를 직접 입력하세요. 어떤 시스템이 어떤 기호를 거부하는지는 특수문자 랜덤 문자열 페이지(영어)에서 자세히 다룹니다.
긴 랜덤 문자열
긴 랜덤 문자열은 암호화 키, 서명용 비밀값, 그리고 입력란을 한계까지 채워 무엇이 깨지는지 확인할 때 유용합니다. 이 도구는 최대 4,096자의 문자열 하나를 생성하며, 어떤 길이에서든 같은 편향 없는 샘플링을 사용합니다. 길이와 문자 집합은 곱해서 작용합니다. 영문자와 숫자 24자는 약 143비트로, 이미 어떤 무차별 대입 공격도 닿을 수 없는 수준이고, 64자는 약 381비트입니다. 대략 128비트를 넘으면 비밀값을 길게 해도 실질적인 보안은 거의 늘지 않고 크기만 늘어나므로, 용도에 맞는 길이를 고르세요. 64자 문자열 생성기와 엔트로피 계산기(둘 다 영어)에서 어떤 조합이든 계산을 확인할 수 있습니다.
안전한 랜덤 문자열 생성기의 조건
조건은 두 가지이며, 대부분의 생성기는 적어도 하나를 놓칩니다. 첫째는 난수원입니다. 안전한 랜덤 문자열 생성기는 암호학적으로 안전한 난수 생성기에서 값을 읽습니다. 브라우저에서는 운영체제에서 난수를 가져오는 crypto.getRandomValues()가 그것입니다. 많은 온라인 도구가 아직도 Math.random()을 쓰는데, 빠르고 게임에는 충분하지만 출력을 몇 개만 관찰하면 예측할 수 있습니다. 자세한 내용은 Math.random()이 안전하지 않은 이유(영어)에서 설명합니다.
둘째는 변환 방식입니다. 난수를 문자 집합 크기로 나눈 나머지를 쓰면 일부 문자가 다른 문자보다 더 자주 나오는데, 이 생성기는 아래와 모듈로 편향 설명(영어)에 나온 거부 샘플링으로 이를 없앱니다. 이를 확인하는 통계 검정 결과는 같은 검정에 걸리는 일부러 결함을 넣은 구현의 결과와 함께 검증 방법 페이지에 공개되어 있습니다.
온라인으로 쓸까, 코드에서 만들까
지금 당장 값이 필요할 때는 온라인 랜덤 문자열 생성기가 가장 빠릅니다. .env 파일에 넣을 비밀값, 테스트 데이터, 한 번 쓸 비밀번호 같은 경우입니다. 애플리케이션이 실행 중에 문자열을 만들어야 한다면, 값을 붙여 넣지 말고 해당 언어에서 생성하세요. 이 페이지 아래쪽의 예제에서 플랫폼별 올바른 방법을 소개합니다.
- Python:
secrets모듈을 쓰고,random은 쓰지 않습니다. - Java:
SecureRandom을 쓰고,java.util.Random은 쓰지 않습니다. - JavaScript: 브라우저와 Node.js 모두에서
crypto.getRandomValues()를 쓰고,Math.random()은 쓰지 않습니다. - C++:
std::random_device에std::uniform_int_distribution을 적용하고, 보장이 필요하면 libsodium을 씁니다. - PHP:
random_int()를 쓰고,rand()나mt_rand()는 쓰지 않습니다. - C#: .NET 8에서는
RandomNumberGenerator.GetString(), .NET 6과 7에서는GetInt32()를 씁니다. - PowerShell: PowerShell 7에서는
RandomNumberGenerator, 5.1에서는 문자마다Get-Random -Maximum을 씁니다.-SetSeed는 절대 붙이지 말고,-Count로 문자열을 만들지 마세요.
랜덤 문자열 생성 도구 고르는 법
랜덤 문자열 생성 도구는 대부분 비슷해 보이므로, 직접 확인할 수 있는 점으로 판단하세요. 값이 브라우저 안에서 만들어지나요, 아니면 기록될 수 있는 서버에서 돌아오나요? 사이트가 어떤 난수원을 쓰는지 밝히고 있나요? 모든 문자 종류를 필수로 지정하면 강도 수치가 마땅히 그래야 하듯 내려가나요? 사람이 읽어야 하는 문자열을 위해 0 O 1 l I 같은 헷갈리는 문자를 뺄 수 있나요? 브라우저 개발자 도구를 열고 네트워크 탭으로 전환한 뒤 생성을 눌러 보세요. 이 사이트에서는 아무것도 나타나지 않습니다. 더 특화된 작업에는 대량 랜덤 문자열 생성기, 사용자 지정 문자 생성기, 비밀번호 생성기, 또는 사이트의 모든 생성기(모두 영어)를 이용하세요.
이 생성기의 작동 방식
모든 값은 운영체제의 암호학적 난수 생성기에 연결되는 브라우저 인터페이스인 crypto.getRandomValues()에서 나옵니다. 대체 경로는 없습니다. 브라우저가 안전한 난수원을 제공하지 못하면, 이 도구는 더 약한 난수원을 몰래 쓰는 대신 생성을 거부합니다.
원시 비트를 문자로 바꾸는 단계에서 대부분의 생성기가 실수합니다. 난수를 문자 집합 크기로 나눈 나머지를 쓰는 흔한 방법은 딱 나누어떨어지지 않아 결과가 문자 집합 앞쪽 문자로 쏠립니다. 1바이트를 62개 문자에 대응시키면 처음 8개 문자가 나머지 54개보다 1.25배 더 자주 나옵니다. 이 도구는 마지막 불완전한 주기에 들어간 값을 버려서 모든 문자가 정확히 같은 확률로 나오게 합니다.
"선택한 종류를 각각 1자 이상 포함" 옵션에도 같은 주의를 기울입니다. 숫자를 정해진 자리에 억지로 넣으면 눈에 보이는 패턴이 남기 때문에, 생성기는 후보 문자열 전체를 만든 뒤 제약 조건을 만족하지 않으면 통째로 버립니다. 유효한 문자열은 모두 같은 확률로 나오며, 엔트로피 표시도 단순한 공식의 값이 아니라 실제 값으로 내려갑니다.
믿어 달라고 부탁하는 대신 검정 결과를 공개합니다. 생성한 문자 500,000개에 대해 문자 빈도 카이제곱 검정은 p = 0.673입니다. 같은 검정 모음을 일부러 편향시킨 구현에 적용하면 자유도 61에서 카이제곱 = 3345으로 잡아냅니다. 그래서 검정이 충분히 민감하고, 문제없다는 결과에 의미가 있다는 것을 알 수 있습니다. 검증 방법 전체 보기(영어).
직접 코드로 만들기
브라우저 탭이 아니라 애플리케이션 안에서 필요하다면, 언어별 올바른 방법은 다음과 같습니다. 모든 예제는 해당 플랫폼의 암호학적 난수원과 편향 없는 변환을 사용합니다.
JavaScript (브라우저 및 Node 19 이상)
const ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
function randomString(length) {
const n = ALPHABET.length;
// Largest multiple of n that fits in a uint32. Values at or above this
// are discarded, which is what removes the modulo bias.
const limit = Math.floor(2 ** 32 / n) * n;
const out = new Array(length);
const buf = new Uint32Array(length);
crypto.getRandomValues(buf);
for (let i = 0, j = 0; i < length; i++) {
let v = buf[j++];
while (v >= limit) {
// Refill one word at a time on the rare rejection.
const extra = new Uint32Array(1);
crypto.getRandomValues(extra);
v = extra[0];
}
out[i] = ALPHABET[v % n];
}
return out.join("");
}
randomString(24); crypto.getRandomValues()는 한 번에 65,536바이트를 넘는 요청을 거부하므로, 대량으로 만들 때는 나누어 요청해야 합니다.
Python 3.6+
import secrets
import string
ALPHABET = string.ascii_letters + string.digits
def random_string(length: int) -> str:
# secrets.choice() is unbiased: it uses randbelow(), which is itself
# rejection sampling over os.urandom. Do not use random.choice() here,
# which is a Mersenne Twister and is not cryptographically secure.
return "".join(secrets.choice(ALPHABET) for _ in range(length))
random_string(24) secrets는 Python 3.6부터 표준 라이브러리에 포함되어 있습니다. random 모듈을 쓰는 방식은 비밀값에 맞지 않습니다.
Go
package main
import (
"crypto/rand"
"math/big"
)
const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
func randomString(length int) (string, error) {
out := make([]byte, length)
max := big.NewInt(int64(len(alphabet)))
for i := range out {
// rand.Int is unbiased; it rejects internally.
n, err := rand.Int(rand.Reader, max)
if err != nil {
return "", err
}
out[i] = alphabet[n.Int64()]
}
return string(out), nil
} math/rand가 아니라 crypto/rand를 쓰세요. Go 1.20부터 math/rand의 전역 생성기에는 자동으로 무작위 시드가 설정되지만, 예측 가능성은 전혀 나아지지 않습니다.
Rust
// rand = "0.9"
use rand::Rng;
use rand::distr::{Alphanumeric, SampleString};
fn random_string(length: usize) -> String {
// rand::rng() is a thread-local ChaCha12 CSPRNG, seeded from the
// operating system and reseeded periodically.
// Alphanumeric samples uniformly over A-Z a-z 0-9.
Alphanumeric.sample_string(&mut rand::rng(), length)
}
// With an arbitrary alphabet, random_range rejection-samples:
fn random_from(alphabet: &[u8], length: usize) -> String {
let mut rng = rand::rng();
(0..length)
.map(|_| alphabet[rng.random_range(0..alphabet.len())] as char)
.collect()
} rand 0.8에서는 경로가 다릅니다. rand::distr 대신 rand::distributions, SampleString 대신 DistString, random_range 대신 gen_range, rand::rng() 대신 rand::thread_rng()를 씁니다.
PHP 7+
<?php
function randomString(int $length): string {
$alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
$n = strlen($alphabet);
$out = '';
for ($i = 0; $i < $length; $i++) {
// random_int() is unbiased and cryptographically secure.
// rand() and mt_rand() are neither.
$out .= $alphabet[random_int(0, $n - 1)];
}
return $out;
}
echo randomString(24); Java 17+
import java.security.SecureRandom;
public final class RandomString {
private static final String ALPHABET =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
private static final SecureRandom RANDOM = new SecureRandom();
public static String generate(int length) {
StringBuilder sb = new StringBuilder(length);
for (int i = 0; i < length; i++) {
// nextInt(bound) rejects internally, so it is unbiased.
sb.append(ALPHABET.charAt(RANDOM.nextInt(ALPHABET.length())));
}
return sb.toString();
}
} java.util.Random이나 Math.random()이 아니라 SecureRandom을 쓰세요. 앞의 두 가지는 모두 48비트 선형 합동 생성기입니다.
C# / .NET 6+
using System.Security.Cryptography;
public static class RandomStringGenerator
{
private const string Alphabet =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
public static string Generate(int length)
{
// GetString was added in .NET 8 and is unbiased.
return RandomNumberGenerator.GetString(Alphabet, length);
}
// On .NET 6 and 7, GetInt32 is the unbiased primitive:
public static string GenerateLegacy(int length)
{
var chars = new char[length];
for (int i = 0; i < length; i++)
chars[i] = Alphabet[RandomNumberGenerator.GetInt32(Alphabet.Length)];
return new string(chars);
}
} C++11 이상
#include <random>
#include <string>
std::string random_string(std::size_t length) {
static const std::string alphabet =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
// uniform_int_distribution is specified to give every value in the range
// equal probability, so there is no modulo bias to remove by hand.
std::random_device rd;
std::uniform_int_distribution<std::size_t> pick(0, alphabet.size() - 1);
std::string out;
out.reserve(length);
for (std::size_t i = 0; i < length; ++i) {
out += alphabet[pick(rd)];
}
return out;
} std::random_device는 libstdc++, libc++, MSVC에서 운영체제 난수원을 읽지만, 표준은 결정적인 구현도 허용하며 GCC 9.2 이전의 MinGW 빌드가 실제로 그랬습니다. 보장이 중요하면 libsodium의 randombytes_uniform()을 쓰세요. 비밀값에 std::rand()나 std::mt19937은 절대 쓰지 마세요.
PowerShell 7
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
# GetInt32 draws from the OS CSPRNG and rejection samples internally.
-join (1..24 | ForEach-Object {
$chars[[System.Security.Cryptography.RandomNumberGenerator]::GetInt32($chars.Length)]
}) Windows PowerShell 5.1은 GetInt32가 없는 .NET Framework에서 실행됩니다. 5.1에서는 Get-Random -Maximum $chars.Length로 문자를 하나씩 고르세요. -SetSeed를 지정하지 않는 한 시스템 CSPRNG를 사용합니다. 같은 문자를 반복하지 않는 Get-Random -Count는 피하세요.
Shell
# 24 alphanumeric characters from the kernel CSPRNG.
LC_ALL=C tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 24; echo
# Base64, URL-safe, from 32 bytes of entropy.
openssl rand -base64 32 | tr '+/' '-_' | tr -d '=' tr은 집합에 없는 바이트를 집합 안으로 접어 넣지 않고 버리므로 이 파이프라인에는 편향이 없습니다. `head -c 24`를 `tr` 앞에 두면 원시 24바이트 중 영숫자만 남아, 24자가 아니라 더 짧고 길이도 일정하지 않은 문자열이 됩니다.
토큰, 비밀번호, 대량 생성, 언어별로 흔한 실수를 다룬 자세한 가이드(영어)입니다. 모든 예제는 실제 실행 환경에서 동작을 확인했습니다.
길이 정하기
길이는 문자 집합과 함께 볼 때만 의미가 있습니다. 숫자 20자는 약 66비트이고, 영문자와 숫자 62개 중에서 고른 20자는 119비트입니다. 아래 표는 목표 강도에 도달하는 데 필요한 문자 수이며, 생성기에는 현재 선택한 설정의 정확한 값이 표시됩니다.
| 문자 집합 | 비트/문자 | 64비트 | 112비트 | 128비트 |
|---|---|---|---|---|
| 숫자만 (10) | 3.3219 | 20 | 34 | 39 |
| 소문자 (26) | 4.7004 | 14 | 24 | 28 |
| 16진수 (16) | 4.0000 | 16 | 28 | 32 |
| 영문자와 숫자 (62) | 5.9542 | 11 | 19 | 22 |
| 헷갈리는 문자 제외 (49) | 5.6147 | 12 | 20 | 23 |
| 안전한 기호 포함 (74) | 6.2095 | 11 | 19 | 21 |
헷갈리는 문자를 빼면 문자당 0.3395비트, 즉 5.70%가 줄어듭니다. 17자마다 한 글자를 더하면 되찾을 수 있으므로, 사람이 소리 내어 읽거나 다시 입력해야 하는 문자열이라면 대개 뺄 만한 가치가 있습니다.
자주 묻는 질문
랜덤 문자열 생성기란 무엇인가요?
랜덤 문자열 생성기는 영문자, 숫자, 기호 같은 문자 집합에서 각 문자를 무작위로 골라 문자열을 만드는 도구입니다. 좋은 생성기는 암호학적으로 안전한 난수원을 쓰고 모든 문자에 정확히 같은 확률을 주기 때문에, 결과를 예측하거나 재현할 수 없습니다.
랜덤 문자열은 어디에 쓰이나요?
랜덤 문자열은 API 키, 세션 토큰, 비밀번호 재설정과 이메일 인증 링크, CSRF 토큰, 비밀번호, 암호화와 서명용 비밀값, 데이터베이스와 파일 식별자, 쿠폰과 초대 코드, 그리고 애플리케이션이 특정 길이의 입력을 어떻게 처리하는지 확인하는 테스트 데이터로 쓰입니다.
온라인 랜덤 문자열 생성기를 써도 안전한가요?
문자열이 브라우저 안에서 생성되어 어디로도 전송되지 않고, 도구가 안전한 난수원을 쓴다면 안전합니다. 이 사이트는 직접 확인할 수 있습니다. 브라우저 개발자 도구에서 네트워크 탭을 열고 생성을 눌러도 요청이 하나도 나타나지 않습니다. 서버에서 값을 만드는 생성기는 그 값을 여러분에게 보내야 하므로, 중간에 기록될 수 있습니다.
이 랜덤 문자열 생성기는 무료인가요?
네. 무료이고, 계정이 필요 없으며, 사용 횟수 제한도 상업적 이용 제한도 없습니다. 브라우저에서 온라인으로 동작하며, 페이지를 불러온 뒤에는 오프라인에서도 계속 동작합니다.
특수문자가 들어간 랜덤 문자열은 어떻게 만드나요?
!#$% 버튼을 켜세요. ! # $ % * + - = ? @ ^ _ 기호 12개가 추가되며, 거의 모든 비밀번호 정책에서 허용되고 셸 명령이나 URL을 망가뜨리지 않습니다. 다른 기호 조합이 필요하면 추가 옵션의 사용자 지정 문자 집합 입력란에 원하는 문자를 그대로 입력하세요.
긴 랜덤 문자열은 어떻게 만드나요?
슬라이더 옆의 숫자 입력란에 길이를 입력하세요. 슬라이더는 128까지지만 입력란에는 4,096자까지 원하는 길이를 넣을 수 있습니다. 입력하는 동안 엔트로피 표시가 갱신되므로, 용도에 충분한 길이가 되었는지 볼 수 있습니다.
영숫자 랜덤 문자열은 어떻게 만드나요?
A-Z, a-z, 0-9 버튼은 켜 두고 기호 버튼은 끈 상태로 두세요. 이것이 기본 설정입니다. 62자짜리 문자 집합이 되어 문자당 약 5.95비트이므로, 24자 문자열은 약 143비트입니다. 영문자만 쓰려면 0-9를, 숫자만 쓰려면 영문자 버튼 두 개를 모두 끄세요.
랜덤 문자열 여러 개를 한 번에 만들 수 있나요?
네. 추가 옵션을 열고 최대 10,000까지 개수를 정하세요. 결과는 한 줄에 하나, 쉼표로 구분, JSON 배열, 따옴표로 묶은 목록, .env 할당문으로 표시할 수 있고, 복사하거나 파일로 다운로드할 수 있습니다. 중복이 없어야 하면 "모든 결과가 서로 달라야 함"을 체크하세요.
랜덤 문자열은 고유한가요?
보장되지는 않지만, 충분히 긴 문자열은 실제로는 고유합니다. 중복은 생일 문제를 따릅니다. 영문자와 숫자 24자에 해당하는 약 143비트라면, 중복이 생길 가능성이 커지기까지 약 2^71개의 문자열을 만들어야 합니다. 짧은 문자열은 다릅니다. 6자 코드는 훨씬 빨리 중복되므로, 문자열이 짧을 때는 데이터베이스에서 고유성을 확인하세요.
랜덤 문자열 생성기가 안전하려면 무엇이 필요한가요?
브라우저의 crypto.getRandomValues() 같은 암호학적으로 안전한 난수원과, 난수를 문자로 바꾸는 편향 없는 변환입니다. Math.random()으로 만든 생성기는 예측할 수 있고, 거부 샘플링 없이 나머지 연산을 쓰는 생성기는 일부 문자를 더 자주 나오게 합니다. 이 도구는 둘 다 하지 않으며, 검정 결과를 공개합니다.
Python에서 랜덤 문자열은 어떻게 만드나요?
secrets 모듈을 쓰세요: "".join(secrets.choice(string.ascii_letters + string.digits) for _ in range(24)). secrets.choice는 암호학적으로 안전하고 편향이 없습니다. random.choice는 메르센 트위스터여서 출력으로 예측할 수 있으니 쓰지 마세요.
Java에서 랜덤 문자열은 어떻게 만드나요?
java.security.SecureRandom 하나를 만들고, 문자마다 nextInt(alphabet.length())를 호출해 alphabet.charAt()을 StringBuilder에 붙이세요. 상한을 준 nextInt는 편향이 없습니다. java.util.Random과 Math.random()은 둘 다 예측 가능한 48비트 생성기이므로 쓰지 마세요.
JavaScript에서 랜덤 문자열은 어떻게 만드나요?
crypto.getRandomValues()로 Uint32Array를 채우고, 문자 집합 크기의 가장 큰 배수 이상인 값은 버린 뒤 나머지 값으로 문자 집합을 참조하세요. 모든 최신 브라우저와 Node.js 19 이상에서 동작합니다. 전체 함수는 이 페이지의 코드 예제에 있습니다. 이 용도에 Math.random()은 안전하지 않습니다.
C++에서 랜덤 문자열은 어떻게 만드나요?
std::random_device에 std::uniform_int_distribution을 적용해 문자 집합을 참조하세요. 이 분포는 명세상 편향이 없습니다. std::random_device는 주요 컴파일러에서 운영체제 난수원을 읽지만 표준이 보장하지는 않으므로, 중요한 경우에는 libsodium의 randombytes_uniform()을 쓰세요. std::rand()는 피하세요.
PHP에서 랜덤 문자열은 어떻게 만드나요?
문자마다 random_int(0, strlen($alphabet) - 1)를 호출해 그 위치의 문자를 붙이세요. random_int는 암호학적으로 안전하고 편향이 없으며 PHP 7부터 기본 제공됩니다. 비밀로 해야 하는 값에는 rand(), mt_rand(), str_shuffle()을 쓰지 마세요.
C#에서 랜덤 문자열은 어떻게 만드나요?
.NET 8 이상에서는 RandomNumberGenerator.GetString(alphabet, length)를 호출하면 한 줄로 안전하고 편향 없이 만들 수 있습니다. .NET 6과 7에서는 문자마다 RandomNumberGenerator.GetInt32(alphabet.Length)를 호출하세요. System.Random은 비밀값에 적합하지 않습니다.
PowerShell에서 랜덤 문자열은 어떻게 만드나요?
PowerShell 7.4 이상에서는 [System.Security.Cryptography.RandomNumberGenerator]::GetString($chars, 24)를 호출하세요. 이 메서드가 없는 Windows PowerShell 5.1에서는 문자마다 $chars[(Get-Random -Maximum $chars.Length)]를 붙이세요. Get-Random은 -SetSeed를 주지 않는 한 시스템의 암호학적 난수 생성기를 씁니다. 같은 문자를 반복하지 않는 Get-Random -Count는 피하세요.
Node.js에서 랜덤 문자열은 어떻게 만드나요?
16진수나 URL에 안전한 문자열에는 crypto.randomBytes(16).toString("hex")나 crypto.randomBytes(18).toString("base64url")을 쓰세요. 사용자 지정 문자 집합이라면 안전하고 편향 없는 crypto.randomInt(alphabet.length)로 문자를 하나씩 고르세요. Math.random()으로 비밀값을 만들지 마세요.
Linux나 Bash에서 랜덤 문자열은 어떻게 만드나요?
영문자와 숫자 24자라면 LC_ALL=C tr -dc "A-Za-z0-9" < /dev/urandom | head -c 24를, 32자 16진수 문자열이라면 openssl rand -hex 16을 실행하세요. 둘 다 커널 난수원을 읽습니다. $RANDOM은 암호학적이지 않은 생성기에서 나온 15비트 값이므로 피하세요.
Go에서 랜덤 문자열은 어떻게 만드나요?
crypto/rand를 쓰세요. Go 1.24부터 rand.Text()는 128비트 이상의 무작위성을 가진 26자 Base32 문자열을 반환합니다. 직접 정한 문자 집합에는 rand.Int(rand.Reader, big.NewInt(int64(len(alphabet))))로 문자를 하나씩 고르세요. 비밀값에 math/rand는 절대 쓰지 마세요.
Excel에서 랜덤 문자열은 어떻게 만드나요?
Excel 365에서는 =TEXTJOIN("",TRUE,CHAR(RANDARRAY(10,1,65,90,TRUE)))로 무작위 대문자 10자를 얻을 수 있으며, 시트가 다시 계산될 때마다 바뀝니다. Excel의 난수 함수는 암호학적으로 안전하지 않으므로 테스트 데이터에만 쓰고, 비밀번호나 키는 안전한 도구로 만드세요.
제가 생성한 값이 서버로 전송되나요?
아니요. 생성은 Web Crypto API를 사용해 모두 브라우저 안에서 이루어집니다. 값을 보낼 백엔드가 없으며, 직접 확인할 수 있습니다. 브라우저 개발자 도구를 열고 네트워크 탭으로 전환한 뒤 생성을 누르세요. 아무것도 나타나지 않습니다.
Math.random()을 쓰는 것과 무엇이 다른가요?
Math.random()은 암호학적으로 안전하지 않습니다. V8은 이를 128비트 비암호학적 생성기인 xorshift128+로 구현하며, JavaScript 명세도 출력이 예측 불가능할 것을 요구하지 않습니다. 출력을 몇 개만 관찰해도 내부 상태를 복원해 과거와 미래의 모든 값을 재현할 수 있다는 연구가 공개되어 있습니다. 이 도구는 운영체제 CSPRNG에서 난수를 가져오는 crypto.getRandomValues()를 씁니다.
모듈로 편향이란 무엇이고, 이 도구에도 있나요?
난수를 나머지 연산으로 줄이면 결과가 문자 집합 앞쪽으로 쏠립니다. 1바이트를 62개 문자에 대응시키면 256 = 4x62 + 8이 되어 처음 8개 문자가 나머지보다 1.25배 더 자주 나옵니다. 이 도구는 거부 샘플링으로 이를 없앱니다. 마지막 불완전한 주기에 들어간 값은 끼워 넣지 않고 버립니다.
모든 문자 종류를 필수로 하면 왜 엔트로피가 내려가나요?
내려가는 것이 맞기 때문입니다. 숫자를 1자 이상 필수로 하면 숫자가 없는 문자열은 모두 제외되므로 가능한 결과가 줄고, 실제 엔트로피는 길이 x log2(문자 집합 크기)보다 낮아집니다. 대부분의 생성기는 계속 더 높은 수치를 보여 주지만, 이 도구는 포함-배제 원리로 유효한 문자열 수를 세어 실제 값을 표시하고, 제약이 없을 때의 값을 괄호 안에 함께 보여 주어 그 비용을 알 수 있게 합니다.
랜덤 문자열은 얼마나 길어야 하나요?
무엇을 보호하느냐에 달려 있습니다. 요청 횟수가 제한된 엔드포인트를 상대로 온라인에서만 추측할 수 있는 값이라면 64비트면 넉넉합니다. 탈취되어 오프라인에서 공격받을 수 있는 비밀값이라면 112비트 이상을 목표로 하세요. 영숫자 19자면 113비트입니다. 비밀번호의 경우 NIST SP 800-63B는 최소 15자를 요구하며, 문자 조합 규칙은 명시적으로 권장하지 않습니다.
비밀번호, API 키, 세션 토큰에 써도 되나요?
네. 난수원은 운영체제가 모든 애플리케이션에 제공하는 것과 같고, 문자로 바꾸는 과정에도 편향이 없습니다. 다만 값이 이 페이지를 떠난 뒤까지 보호해 줄 수는 없으니, 결과는 다른 비밀값과 똑같이 다루세요.
속도
32자 문자열 10,000개를 생성하는 데 17 ms가 걸립니다. 대량 생성은 여러 덩어리로 나누어 처리하고 그 사이마다 메인 스레드를 비워 주므로, 페이지는 계속 반응하고 작업을 중간에 취소할 수도 있습니다. 현재 Google 검색 첫 페이지에 오른 생성기 중 세 곳은 개수 제한이 전혀 없어 탭이 멈춰 버립니다.