/dev/urandom의 신화 파헤치기

수년 동안 개발자 커뮤니티에는 /dev/urandom은 안전하지 않으며 모든 암호학적 목적으로 /dev/random을 사용해야 한다는 지속적인 신화가 퍼져 있었습니다. 이러한 오해는 Linux man pages를 대충 읽음으로써 강화되는 경우가 많으며, 이로 인해 개발자들은 비차단(non-blocking) 장치를 선택함으로써 보안을 희생하고 있다고 믿게 됩니다.

실제로 두 장치의 차이는 보안보다는 주로 가용성의 문제입니다. Linux 커널의 난수 생성 메커니즘의 근저에 있는 원리를 이해하면, 거의 모든 실질적인 목적으로 /dev/urandom이 충분할 뿐만 아니라 권장된다는 것을 알 수 있습니다.

핵심적인 오해: 진정한 난수 vs. 의사 난수

많은 개발자들은 /dev/random이 "진정한" 난수(환경적 노이즈에서 직접 유도됨)를 제공하는 반면, /dev/urandom은 보안성이 낮은 "의사 난수"를 제공한다고 믿습니다. 이는 Linux 커널이 작동하는 방식에 대한 근본적인 오해입니다.

계산적 보안 vs. 정보 이론적 보안

이 차이가 왜 신화인지 이해하려면, 먼저 두 가지 유형의 보안을 구분해야 합니다.

  1. 정보 이론적 보안 (Information-Theoretic Security): 이는 무한한 계산 능력을 가진 공격자도 암호화를 해독할 수 없는 "골드 표준"입니다. 일회용 패드(One-time pad)가 주요 예시입니다. 이는 극도로 비실용적이기 때문에 실제 소프트웨어 엔지니어링에서는 거의 사용되지 않습니다.
  2. 계산적 보안 (Computational Security): 이는 AES, RSA, Elliptic Curve 암호학에서 사용되는 보안 수준입니다. 이는 해결책이 존재할 수 있지만, 이를 찾는 데 전 세계의 모든 컴퓨터를 사용하여 우주의 나이보다 더 오랜 시간이 걸릴 것이라고 가정합니다.

거의 모든 암호학 라이브러리(OpenSSL, GnuTLS)와 알고리즘(AES, RSA)이 계산적 보안만을 제공하기 때문에, 암호화를 위해 계산적으로 안전한 알고리즘을 사용하면서 시드(seed)를 위해 "진정한" 난수를 고집하는 것은 논리적으로 일관성이 없습니다. 만약 근저에 있는 블록 암호나 해시 함수가 깨진다면, 난수의 출처는 가장 덜 걱정해야 할 문제가 될 것입니다.

Linux RNG가 실제로 작동하는 방식

/dev/random은 엔트로피 풀(entropy pool)에서 직접 값을 가져오며 풀이 비어 있을 때 차단(block)하고, /dev/urandom은 품질이 낮은 PRNG로 전환된다는 일반적인 믿음이 있습니다. 이는 틀린 내용입니다.

CSPRNG 아키텍처

/dev/random/dev/urandom은 모두 동일한 CSPRNG(Cryptographically Secure Pseudorandom Number Generator)에 의해 공급됩니다. 두 장치가 제공하는 모든 난수 비트는 이 CSPRNG를 통해 처리됩니다.

  • Linux 4.8 이전: 두 장치 모두 동일한 내부 풀과 CSPRNG를 사용했습니다. 유일한 차이점은 커널의 가용 엔트로피에 대한 추정치가 특정 임계값 아래로 떨어지면 /dev/random이 차단된다는 것이었습니다.
  • Linux 4.8 이후: 아키텍처가 진화했지만, 근본적인 원칙은 동일하게 유지됩니다: /dev/urandom은 엔트로피 풀에 의해 시드(seed)된 CSPRNG의 출력을 제공합니다.

결정적으로, "엔트로피 카운트"는 정확한 측정이 아니라 추정치입니다. 이 추정치가 보수적이거나 부정확할 수 있기 때문에, /dev/random에서 차단되는 것이 실제로 "더 많은" 보안을 보장하지는 않습니다. 그것은 단지 시스템이 기다리게 만들 뿐입니다.

차단의 위험성

인식된 보안을 위해 /dev/random을 선택하는 것은 상당한 위험을 초래합니다: 가용성.

/dev/random이 차단되면 애플리케이션이 중단됩니다. 이는 웹 서버가 일시적인 세션 키를 기다리는 동안 멈춰버리는 것과 같은 운영 환경에서의 치명적인 실패로 이어질 수 있습니다. 한 개발자가 커뮤니티 토론에서 언급했듯이:

"가끔씩 페이지 로드 속도가 몇 초간 차단될 때가 있었습니다... 차단된 프로세스를 확인해 보니 역시나 /dev/random 읽기에 걸려 차단되어 있었습니다."

기술적 실패를 넘어, 차단은 위험한 임시방편을 조장합니다. 개발자들이 시작되지 않는 시스템이나 멈춰버린 서버를 마주할 때, /dev/random() 호출을 패치하여 제거하거나 시스템을 가동하기 위해 SSL을 완전히 비활성화하는 유혹에 빠질 수 있으며, 이는 /dev/urandom을 사용하는 것보다 훨씬 더 큰 보안 구멍을 만들 수 있습니다.

"엔트로피가 부족하다"는 공포에 대하여

/dev/random을 옹호하는 가장 흔한 논거 중 하나는 엔트로피가 "부족해지면" /dev/urandom이 안전하지 않게 된다는 것입니다. 이는 허수아비 공격(straw man argument)입니다.

암호학에서, CSPRCSPNG가 충분한 엔트로피(통상적으로 256비트)로 시드(seed)된 일단, 이는 무한한 기간 동안 계산적으로 안전한 난수 스트림을 생성할 수 있습니다. 커널이 수행하는 지속적인 재시딩(re-seeding)은 생성기가 난수를 "다 써버려서"가 아니라, "자기 치유(self-healing)\

Sources