메인 콘텐츠로 건너뛰기

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
MySQL의 RAND()는 쿼리 결과 섞기 같은 용도로 의사 난수를 생성합니다. 암호학적으로 안전하지 않은데, 토큰, 솔트, 논스를 생성할 때는 그것이 중요합니다. RANDOM_BYTES()가 그 빈틈을 메우고, VillageSQL의 vsql_crypto 확장은 통합 암호화 API의 일부로 gen_random_bytes()와 gen_random_uuid()를 추가합니다.

MySQL의 랜덤 함수

MySQL은 목적이 매우 다른 두 가지 내장 랜덤 함수를 제공합니다: RAND() — 0과 1 사이의 의사 난수 실수를 반환합니다. 빠르고 보안과 무관한 용도에 적합합니다: 무작위 쿼리 결과, 가중 샘플링, 무작위 행 선택. 암호학적으로 안전하지 않습니다.
RANDOM_BYTES(n) — 암호학적으로 안전한 랜덤 바이트 n개를 VARBINARY로 반환합니다. 토큰, 솔트, 논스, 키에 이것을 사용하세요.

VillageSQL에서: gen_random_bytes()와 gen_random_uuid()

VillageSQL의 vsql_crypto 확장은 gen_random_bytes()와 gen_random_uuid()를 추가하며, 이들은 OpenSSL의 RAND_bytes() — RANDOM_BYTES()와 같은 엔트로피 소스 — 를 사용합니다.
내장 함수 대신 이것들을 쓰는 주된 이유는 일관성입니다: 이미 vsql_crypto의 digest(), hmac(), 또는 encrypt()를 사용하고 있다면, 모든 암호화 작업을 하나의 확장에 두는 것이 업그레이드와 감사를 단순하게 만듭니다.

테스트 데이터 생성하기

랜덤 함수는 테스트 테이블을 시딩할 때 유용합니다:

일회용 토큰과 초대 코드

올바른 함수 선택하기

RANDOM_BYTES()와 gen_random_bytes()는 기능적으로 동등합니다 — 둘 다 같은 품질의 무작위성을 반환합니다. 이미 vsql_crypto를 사용하고 있다면, 암호화 표면을 한곳에 두기 위해 gen_random_bytes()를 사용하세요. 랜덤 바이트만 필요하고 다른 것은 필요 없다면 MySQL의 RANDOM_BYTES()로 충분합니다. 정렬 가능한 변형(v7)과 바이너리 저장을 갖춘 UUID 타입이 필요하면 gen_random_uuid() 대신 vsql_uuid 확장을 사용하세요. 전체 비교는 MySQL의 UUID를 보세요.

자주 묻는 질문

RAND()는 토큰 생성에 안전한가요?

아니요. RAND()는 예측 가능한 상태에서 시드된 의사 난수 생성기입니다. ORDER BY RAND()와 비슷한 보안과 무관한 용도에는 괜찮지만, RAND()로 생성한 토큰은 이론적으로 예측될 수 있습니다. 보안에 민감한 모든 것에는 RANDOM_BYTES() 또는 gen_random_bytes()를 사용하세요.

안전한 토큰에 몇 바이트가 필요한가요?

세션 토큰과 API 키에는 32바이트(256비트)가 표준입니다. 16바이트(128비트)는 실용적인 보안의 최소값입니다. 안전하게 32를 사용하세요.

gen_random_bytes()를 DEFAULT로 사용할 수 있나요?

아니요. MySQL 자체는 DEFAULT 표현식에 비결정론적 함수를 허용합니다 — UUID(), RAND(), NOW() 모두 거기서 동작합니다. gen_random_bytes()는 비결정론적 함수로 등록된 VillageSQL 확장 함수라는 바로 그 이유로 거부되며, VEF는 MySQL 자체가 무엇을 허용하든 DEFAULT 표현식에서 그런 함수를 차단합니다. 대신 각 INSERT 문에서 값을 생성하세요.

gen_random_uuid()와 vsql_uuid의 UUID_V4()의 차이는 무엇인가요?

gen_random_uuid()는 VARCHAR UUID 문자열을 반환합니다. vsql_uuid 확장의 UUID_V4()는 16바이트 바이너리 저장을 갖춘 네이티브 UUID 타입을 반환합니다. UUID를 기본 키로 사용한다면 vsql_uuid의 UUID_V4() 또는 UUID_V7()을 선호하세요. UUID 문자열이 필요하고 별도의 확장을 설치하고 싶지 않을 때 gen_random_uuid()를 사용하세요.

문제 해결

함께 보기