NIST SP 800-90A: DRBG 표준
NIST DRBG 프레임워크의 인스턴스화, 재시드, 예측 저항성, 보안 강도를 이해합니다.
NIST SP 800-90A: DRBG 표준은(는) CoddyKit의 무료 Cryptology Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Cryptology Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Cryptology Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
결정적 난수 비트 생성기가 필요한 이유
암호 연산에는 고품질 난수가 필요합니다. 예를 들어 키 생성, 논스, IV, 솔트, 세션 토큰에 난수가 사용됩니다. 진난수 생성기(TRNG)는 하드웨어 잡음, 인터럽트, 열 잡음과 같은 물리적 원천에서 엔트로피를 수집하지만 느리고 항상 사용할 수 있는 것은 아닙니다. 특히 가상 머신이나 초기 부팅 환경에서는 더욱 그렇습니다. 결정적 난수 비트 생성기(DRBG)는 이 문제를 해결합니다. 소량의 진정한 엔트로피로 DRBG를 시드한 다음 암호 알고리즘을 사용하여 이를 진난수와 계산적으로 구별할 수 없는 대량의 의사난수 비트 스트림으로 확장합니다. NIST SP 800-90A는 현대 암호 구현 대부분에서 사용되는 세 가지 승인된 DRBG 메커니즘을 정의합니다.
DRBG 수명 주기: 인스턴스화, 생성, 재시드
DRBG는 세 가지 기본 연산을 통해 동작합니다. 인스턴스화: 엔트로피 소스에서 얻은 entropy_input, 고유성을 보장하는 일회용 값인 논스, 그리고 선택적으로 애플리케이션별 문맥을 나타내는 personalization_string을 사용하여 DRBG 내부 상태를 초기화합니다. 생성: 요청된 수의 의사난수 비트를 생성하고 과거 상태를 통한 추적을 방지하도록 내부 상태를 갱신합니다. 재시드: 새로운 엔트로피를 DRBG 상태에 주입하여 예측 저항성을 제공합니다. 재시드 후에는 이전 상태를 알고 있던 공격자도 이후 출력을 예측할 수 없습니다. NIST는 최대 생성 간격(reseed_interval)을 지정하며, 세 가지 DRBG 유형 모두 2^48번의 요청이 발생하기 전에 반드시 재시드해야 합니다.
보안 강도와 매개변수 선택
NIST SP 800-90A는 112비트, 128비트, 192비트, 256비트의 네 가지 보안 강도 수준을 정의합니다. 보안 강도는 인스턴스화에 필요한 최소 엔트로피와 생성되는 출력의 품질을 결정합니다. 128비트 보안의 경우 엔트로피 입력은 최소 128비트의 엔트로피를 제공해야 합니다. 관계는 다음과 같습니다. security_strength bits of entropy -> DRBG output computationally indistinguishable from random by an adversary with 2^security_strength operations. 키 길이 선택(AES-128과 AES-256) 및 해시 선택(SHA-256과 SHA-512)은 원하는 보안 강도와 일치하거나 이를 초과하도록 제한됩니다. 매개변수를 과도하게 설정하는 것(128비트 보안에 SHA-512 사용)은 안전하지만 비효율적이며, 매개변수를 부족하게 설정하면 보안이 깨집니다.
Hash_DRBG 구성
Hash_DRBG는 두 개의 상태 값, 즉 출력을 생성하는 값 V와 생성 중에 더해지는 상수 C를 유지합니다. 생성 과정에서 hash_gen은 H(0x01 || V), H(0x01 || V+1), ...을 반복하여 충분한 출력이 생성될 때까지 비트를 만들고, 그다음 V를 V = V + H(0x03 || V) + C + reseed_counter로 갱신합니다. 재시드에서는 Hash_df(해시 파생 함수)를 사용하여 현재 V와 새로운 엔트로피를 결합하고 새 V와 C를 생성합니다. Hash_DRBG는 구현이 간단하고 보안 분석도 단순하므로 제약된 환경에 적합합니다. NIST는 SHA-256 또는 SHA-512를 사용한 인스턴스화를 권장합니다. Hash_DRBG는 Java의 SHA1PRNG(이전 버전)와 OpenSSL의 이전 버전 DRBG에서 사용됩니다.
HMAC_DRBG 구성
HMAC_DRBG는 상태(키 K, 값 V)를 유지합니다. 생성 과정에서는 충분한 출력이 생성될 때까지 V = HMAC(K, V)를 반복한 다음 K = HMAC(K, V || 0x00) 및 V = HMAC(K, V)로 갱신합니다. 갱신 과정에서는 additional_input을 받아 HMAC 연산을 사용하여 K와 V를 재시드합니다. HMAC_DRBG는 HMAC의 보안성(PRF로서의 HMAC 가정)에 기반한 명확한 보안 증명을 제공합니다. 가장 널리 권장되는 DRBG로, OpenSSL(1.1.1부터), mbedTLS, wolfSSL 및 대부분의 TLS 스택에서 HMAC_DRBG를 사용합니다. HMAC 구성은 연속 호출 사이에 기본적인 혼합을 제공하므로 상태가 일부 노출되더라도 역추적 공격을 수행하기가 더 어렵습니다.
CTR_DRBG 구성
CTR_DRBG는 카운터 모드에서 블록 암호(AES)를 사용합니다. 상태는 키 K와 카운터 V입니다. 생성 과정에서는 연속적인 카운터 값 E(K, V), E(K, V+1), ...을 암호화하고 V를 증가시킵니다. 갱신 과정에서는 Block_Cipher_df를 사용하여 additional_input으로부터 새 K와 V를 파생합니다. CTR_DRBG는 가장 빠른 DRBG입니다. AES-NI 하드웨어 가속을 사용하면 최신 프로세서에서 해시 기반 DRBG보다 몇 자릿수 빠릅니다. Windows CNG(CryptGenRandom은 AES-256을 사용하는 CTR_DRBG를 사용), OpenSSL 3.0(기본값), Linux 커널 RNG(getrandom 시스템 호출)에서 기본 DRBG로 사용됩니다. CTR_DRBG의 보안은 AES가 의사난수 순열이라는 점에 의존하며, 이는 수십 년간의 분석으로 충분히 뒷받침되었습니다.
예측 저항성과 재시드
예측 저항성이란 재시드를 통해 새로운 엔트로피가 혼합되면, 과거에 DRBG 상태가 손상된 공격자조차 DRBG 출력을 예측할 수 없게 되는 특성입니다. prediction_resistance_flag=true인 DRBG는 각 Generate 호출 전에 엔트로피 소스를 호출하여 새로운 엔트로피를 주입합니다. 예측 저항성이 없으면 시점 T의 상태가 손상되었을 때 모든 이후 출력을 계산할 수 있으므로 순방향 보안이 깨집니다. 역방향 보안(역추적 저항성이라고도 함)은 현재 상태가 알려져도 과거 출력을 예측할 수 없다는 뜻입니다. HMAC_DRBG와 CTR_DRBG는 각 Generate 이후 현재 상태에서 새 키를 파생하는 갱신 단계를 통해 이를 달성합니다.
엔트로피 소스: NIST SP 800-90B 및 90C
SP 800-90A는 DRBG 알고리즘을 지정하지만 엔트로피 소스는 지정하지 않습니다. SP 800-90B는 엔트로피 소스에 대한 요구 사항을 정의합니다. 하드웨어 잡음원은 특성을 분석하고 검증해야 하며, 엔트로피 추정치는 보수적이어야 하고, 상태 점검은 엔트로피 소스의 오류를 감지해야 합니다. SP 800-90C는 엔트로피 소스와 DRBG를 완전한 난수 비트 생성기로 결합하는 방법을 지정합니다. 일반적인 엔트로피 소스로는 CPU의 RDRAND/RDSEED(하드웨어 RNG로 2012년부터 Intel/AMD CPU에서 사용 가능), OS 엔트로피(Linux의 /dev/urandom, Windows의 BCryptGenRandom), 하드웨어 보안 모듈, TPM 2.0 RNG, 환경 잡음(디스크 타이밍, 네트워크 지터)이 있습니다. 엔트로피가 낮은 상황(가상 머신, 초기 부팅)에서는 취약한 시드를 피하기 위한 특별한 처리가 필요합니다.
FIPS 140-3 인증 요구 사항
FIPS 140-3(암호 모듈 검증에 관한 현재 표준)은 인증된 모듈 내의 모든 난수 생성에 NIST SP 800-90A DRBG를 사용하도록 요구합니다. 모듈은 승인된 DRBG(Hash, HMAC 또는 CTR)를 사용하고, SP 800-90B 요구 사항을 충족하는 승인된 엔트로피 소스에서 시드하며, DRBG 동작을 검증하는 전원 공급 시 자체 테스트(POST)를 수행하고, 0 고정 또는 1 고정 엔트로피 오류를 감지하는 연속 RNG 테스트(CRNGT)를 구현하며, 엔트로피 소스가 사용 가능한 엔트로피를 나타낼 때 재시드를 지원해야 합니다. HSM(Thales Luna, AWS CloudHSM, Utimaco), TLS 가속 카드 및 네트워크 암호화 장비에는 FIPS 140-3 검증 모듈이 필요한 경우가 많으며, 이에 따라 SP 800-90A의 도입이 확대되고 있습니다.
운영 체제의 DRBG
현대 운영 체제는 하드웨어 엔트로피 원천에서 시드를 받은 커널 수준의 DRBG를 유지합니다. Linux는 RDRAND, 인터럽트, 디스크 및 네트워크 이벤트에서 시드를 받는 ChaCha20 기반 DRBG를 사용합니다(커널 5.17부터 적용되었으며, 이전의 Fortuna 유사 설계를 대체했습니다). /dev/urandom은 DRBG 출력을 반환하며, 처음 시드가 설정된 후에는 차단되지 않습니다. /dev/random은 충분한 엔트로피를 사용할 수 있을 때까지 차단됩니다(기존 동작이며, 최근 커널에서는 대부분 제거되었습니다). getrandom(2) 시스템 호출은 현대적인 인터페이스로, DRBG가 시드되기 전 초기 부팅 단계에서만 차단됩니다. Windows는 TPM과 하드웨어 이벤트에서 시드를 받는 커널 RNG에서 CTR_DRBG (AES-256)를 사용합니다. 애플리케이션은 타임스탬프나 PID로 자체 DRBG를 시드하기보다 고수준 인터페이스를 통해 OS의 DRBG를 사용해야 합니다.
DRBG 구현에서 흔히 발생하는 실수
실제 환경에서 DRBG 취약점은 알고리즘의 약점보다 구현 오류에서 발생합니다. (1) 시드 부족: 현재 시각 또는 PID만으로 시드하면 공격자가 시드를 추측할 수 있습니다. (2) 포크 인지 실패: 프로세스가 포크되면 부모와 자식이 동일한 DRBG 상태를 공유하므로 동일한 난수를 생성합니다. 해결 방법은 포크 후 다시 시드하는 것입니다(pthread_atfork 또는 명시적인 getrandom 호출). (3) VM 스냅샷 재사용: VM 스냅샷을 복원하면 DRBG 상태가 스냅샷 시점의 상태로 돌아가 이전에 보았던 출력을 다시 생성합니다. 해결 방법은 VM 시작 시 고유한 엔트로피를 주입하는 것입니다(VIRTIO RNG). (4) 건전성 테스트 실패를 조용히 처리하는 문제: 엔트로피 오류를 감지한 후에도 DRBG가 계속 출력을 생성하면 공격자가 예측할 수 있는 출력이 제공됩니다. (5) DRBG 인스턴스 간에 논스를 재사용하는 문제.
DRBG 재시드 퀴즈
새로운 엔트로피로 DRBG를 재시드하면 어떤 속성이 제공됩니까?
NIST SP 800-90A 요약
NIST SP 800-90A는 승인된 세 가지 DRBG 메커니즘을 정의합니다. Hash_DRBG는 반복 해시를 사용하며 단순하고, HMAC_DRBG는 HMAC 기반으로 명확한 보안 증명을 제공하며 널리 배포되어 있고, CTR_DRBG는 AES 카운터 모드를 사용하여 AES-NI를 통해 가장 빠르며 Windows와 OpenSSL에서 기본값으로 사용됩니다. 모두 Instantiate/Generate/Reseed 수명 주기를 공유하며, reseed_interval은 2^48로 제한됩니다. 보안 강도(112~256비트)에 따라 엔트로피 요구 사항이 결정됩니다. 예측 저항성을 사용하려면 각 Generate 호출 전에 재시드해야 합니다. FIPS 140-3은 SP 800-90B 엔트로피 원천을 사용하는 SP 800-90A DRBG를 의무화합니다. 포크 인지 실패, VM 스냅샷 재사용, 시드 부족이 실제 구현에서 발생하는 주요 문제입니다.
AI 튜터와 함께 Cryptology Academy을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 67
- 레슨
- 261
자주 묻는 질문
“NIST SP 800-90A: DRBG 표준” 강의는 무료인가요?
네 — “NIST SP 800-90A: DRBG 표준” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Cryptology Academy 강의 전체를 잠금 해제할 수 있습니다. Cryptology Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“NIST SP 800-90A: DRBG 표준”에서 뭘 배우나요?
NIST DRBG 프레임워크의 인스턴스화, 재시드, 예측 저항성, 보안 강도를 이해합니다. 브라우저에서 직접 실행하는 실습 코드로 Cryptology Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Cryptology Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Cryptology Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“NIST SP 800-90A: DRBG 표준” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Cryptology Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Cryptology Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- NIST SP 800-90A: DRBG 표준
- Hash-DRBG, HMAC-DRBG 및 CTR-DRBG 내부 구조
- Dual EC DRBG 백도어 사건
- RNG 구현 테스트와 검증