운영 체제는 어떻게 랜덤 시드에 대한 엔트로피를 생성합니까?


19

Linux에서 파일 /dev/random/dev/urandom 파일은 의사 임의 바이트의 차단 및 비 차단 소스입니다.

일반 파일로 읽을 수 있습니다.

$ hexdump /dev/random
0000000 28eb d9e7 44bb 1ac9 d06f b943 f904 8ffa
0000010 5652 1f08 ccb8 9ee2 d85c 7c6b ddb2 bcbe
0000020 f841 bd90 9e7c 5be2 eecc e395 5971 ab7f
0000030 864f d402 74dd 1aa8 925d 8a80 de75 a0e3
0000040 cb64 4422 02f7 0c50 6174 f725 0653 2444
...

다른 많은 유닉스가 제공 변형 /dev/random/dev/urandom차단 / 비 블로킹 구별하지 않고,뿐만 아니라.

Windows와 동등한 CryptGenRandom()기능 입니다.

운영 체제는 의사 난수를 어떻게 생성합니까?


어떤 연구를 했습니까? Wikipedia와 같은 표준 사이트 나 Security.SE 또는 Crypto.SE를 살펴 보셨습니까? : 위키 백과는이에 대한 기사가 en.wikipedia.org/wiki//dev/random을 . Wikipedia에 귀하의 질문에 대한 답변이있는 기사가있을 경우, 이는 충분히 연구하지 않은 것의 정의입니다. (여기서 요청하기 전에 상당한 양의 연구를 수행하고 수행 한 질문 연구에 우리를 보여 주길 기대합니다.)
DW

답변:


31

질문의 제목과 본문은 OS가 엔트로피를 만드는 방법 (실제로 엔트로피 가져와야 함)과이 엔트로피에서 의사 난수를 생성하는 방법에 대해 두 가지 다른 질문을 합니다. 차이점을 설명하면서 시작하겠습니다.

무작위성은 어디에서 오는가?

난수 생성기 (RNG)는 두 가지 유형으로 제공됩니다.

  • DRBG (Deterministic Random Bit Generators ) 또는 이들의 조합 이라고도 하는 의사 난수 생성기 (PRNG) 는 고정 크기 가변 내부 상태를 유지하고 해당 상태의 출력을 계산하는 결정적 알고리즘입니다.
  • "진정한"난수 생성기라고도하는 HRNG ( 하드웨어 난수 생성기)는 물리적 현상을 기반으로합니다. “참”은 실제로 임의적 인 것으로 알려진 정보 소스가없고 예측할 수없는 정보 소스 만 있기 때문에 약간의 오해 입니다.

물리적 현상의 시뮬레이션과 같은 일부 응용 프로그램은 통계 테스트를 통과하는 임의의 숫자로 구성 될 수 있습니다. 암호화 키 생성과 같은 다른 응용 프로그램에는 예측할 수없는 강력한 속성이 필요합니다 . 예측 불가능 성은 통계적 속성이 아니라 보안 속성입니다. 즉, 공격자는 난수 생성기의 출력을 추측 할 수 없습니다. (보다 정확하게는, 상대방이 RNG 출력의 각 비트를 추측 할 확률을 측정하여 RNG의 품질을 측정 할 수 있습니다. 확률이 1/2과 다른 경우 RNG가 나쁩니다.)

방사능 붕괴 또는 배경 소음에 대한 천문학적 관측 또는 주식 시장 변동과 같은 통계적 특성이 좋은 임의의 데이터를 생성하는 물리적 현상이 있습니다. 이러한 물리적 측정은 편향 확률 분포를 균일 한 확률 분포로 바꾸기 위해 컨디셔닝 ( 미백 )이 필요 합니다 . 모든 사람에게 알려진 물리적 측정은 암호화에 좋지 않습니다. 주식 시장 변동은 지오 해싱 에는 좋지만 비밀 키를 생성하는 데 사용할 수는 없습니다 .

암호화에는 비밀이 필요합니다 . 공격자는 컨디셔닝에 들어간 데이터를 찾을 수 없어야합니다. 거기 안전한 암호화 의사 난수 발생기 출력이 외에도 암호화 애플리케이션에서 사용하기에 적합한 알고리즘 PRNG (CSPRNG) 양호한 통계적 특성을 갖는이 . CSPRNG를 암호로 안전하게 만드는 속성 중 하나는 그 출력으로 인해 상대방이 내부 상태를 재구성 할 수 없다는 것입니다 (CSPRNG에 의해 생성 된 비트는 모두 알고 있지만 누락 된 비트를 찾는 데 도움이되지 않음). CSPRNG를 만드는 방법에 대해서는 다루지 않겠습니다. 왜냐하면 그것은 쉬운 일이기 때문입니다. 전문 암호 전문가가 제공 한 레시피를 따를 수 있습니다 ( 표준 사용)이러한 Hash_DRBG, HMAC_DRBG 또는 CTR_DRBG에서와 같은 알고리즘, NIST SP 800-90A ) 또는 ANSI X9.31 PRNG . CSPRNG에는 보안을 유지하기 위해 상태의 두 가지 속성이 필요합니다.

  • 상태는 처음부터 항상 비밀로 유지해야합니다 (상태의 노출이 과거의 결과를 나타내지는 않지만).
  • 상태는 선형이어야합니다. RNG는 동일한 상태에서 두 번 시작해서는 안됩니다.

난수 생성기의 아키텍처

실제로, 거의 모든 양호한 난수 생성기 는 CSPRNG를 하나 이상의 엔트로피 소스 와 결합 합니다 . 간단히 말해서 엔트로피는 데이터 소스의 예측 불가능 성을 측정 한 것입니다. 하드웨어 RNG를 기반으로 난수 생성기를 작성하는 것은 어렵습니다.

  • 원시 데이터는 어쨌든 컨디셔닝이 필요할 것이므로 확률 데이터를 균일 한 분포로 바꿉니다.
  • 무작위 소스의 출력은 비밀로 유지해야합니다.
  • 엔트로피 소스는 종종 수요에 비해 느립니다.

따라서 운영 체제의 RNG는 거의 항상 다음과 같이 작동합니다 .

  1. 예측할 수없는 내부 상태를 구축 하기에 충분한 엔트로피 를 축적하십시오.
  2. 누적 엔트로피를 시드, 즉 내부 상태의 초기 값으로 사용하여 CSPRNG를 실행하십시오 .
  3. 선택적으로 추가 엔트로피를 내부 상태로 주기적으로 혼합하십시오. 엔트로피는 측정 가능한 속도로 "소비"되지 않기 때문에 반드시 필요한 것은 아닙니다 . 전체 시스템을 손상시키지 않으면 서 RNG 상태를 유출하는 특정 위협에 대비할 수 있습니다.

엔트로피 수집에는 하드웨어에 대한 액세스가 필요하고 엔트로피 소스는 공유 리소스를 구성하기 때문에 난수 생성 서비스는 운영 체제 작업의 일부입니다. 운영 체제는이를 조합하고 응용 프로그램에 적합한 출력을 도출해야합니다. 엔트로피 소스의 의사 랜덤 컨디셔닝은 운영 체제에 필요합니다. 이것은 근본적으로 어렵지 않기 때문에 암호로 안전 할 수도 있습니다. (그리고 응용 프로그램이 서로를 신뢰하지 않는 운영 체제에서는 필요합니다. 완전히 협력적인 시스템에서는 각 응용 프로그램이 운영 체제 인 경우 내부적으로 자체 CSPRNG를 실행해야합니다. 어쨌든 하나를 제공하지 않았습니다).

영구 저장 장치가있는 대부분의 시스템은 부팅 할 때 디스크에서 RNG 시드를로드하고 (“디스크”를 모든 종류의 영구 저장 장치의 약어로 사용합니다) 시드를 해당 시드에서 생성 된 새로운 의사 임의 데이터로 덮어 씁니다. 또는 해당 시드와 다른 엔트로피 소스에서 생성 된 임의의 데이터가있는 경우. 이렇게하면 재부팅 후 엔트로피를 사용할 수 없더라도 이전 세션의 엔트로피가 재사용됩니다.

저장된 상태에 대해주의를 기울여야합니다. 상태가 선형이어야한다고 어떻게 말했는지 기억하십니까? 동일한 디스크 상태에서 두 번 부팅하면 동일한 RNG 출력이 나타납니다. 이것이 환경에서 가능하다면 다른 엔트로피 소스가 필요합니다. 백업을 복원하거나 가상 머신을 복제 할 때주의하십시오 . 복제를위한 한 가지 기술은 저장된 엔트로피를 예측 가능하지만 고유 한 일부 환경 데이터 (예 : 시간 및 MAC 주소)와 혼합하는 것입니다. 환경 데이터를 예측할 수있는 경우 저장된 VM 상태를 가진 사람은 누구나 분기 된 VM 인스턴스의 시드를 재구성 할 수 있습니다.

엔트로피 소스

엔트로피 소스를 찾고 올바르게 사용하는 것은 운영 체제에서 난수 생성에서 가장 어려운 부분입니다. 사용 가능한 엔트로피 소스는 하드웨어와 하드웨어가 실행되는 환경에 따라 달라집니다.

운이 좋으면, 하드웨어는 엔트로피 소스로 사용될 수있는 주변 장치를 제공합니다 : 전용 또는 측면 목적 의 하드웨어 난수 생성기 . 예를 들면 다음과 같습니다.

NIST SP800-90B 는 하드웨어 RNG에 대한 설계 지침을 제공합니다. 하드웨어 RNG를 평가하는 것은 어렵습니다 . 하드웨어 RNG는 일반적으로 섬세한 짐승이며주의해서 사용해야합니다. 많은 유형의 부팅 후 시간이 필요하고 불안정화를 위해 읽기 사이에 시간이 필요하며 온도와 같은 환경 조건에 종종 민감합니다.

Ivy Bridge 아키텍처 기반의 Intel x86-64 프로세서 는 열 노이즈에 의해 시드 된 CSPRNG 의 출력을 제공하는 RdRand명령 을 제공합니다 . 대부분의 스마트 폰 프로세서에는 하드웨어 엔트로피 소스가 포함되어 있지만 Android에서는 항상 사용하지는 않습니다.

강력한 엔트로피 소스가없는 시스템 은 약한 엔트로피 소스결합 하고 충분하다고 생각 하는 것 ( 너무 힘이 될 것임) 과 관련 이 있습니다. 임의의 마우스 이동 은 클라이언트 컴퓨터에 널리 사용되며 마우스를 이동 하도록 요청하는 특정 암호화 프로그램 에서 보안 쇼 를 보았을 수 있습니다 (21 세기 PC 운영 체제에서도 OS 가 엔트로피축적 하지 않아도 응용 프로그램은 귀찮게 할 필요가 없습니다) ).

예제를보고 싶다면 Linux를 볼 수 는 있지만 완벽하지는 않습니다 . 특히, /dev/random너무 많은 블록은 ( 엔트로피가 지나치게 보수적이라는 개념으로 충분한 엔트로피를 사용할 수있을 때까지 차단 하기 때문에 ), /dev/urandom첫 번째 부팅을 제외하고 거의 항상 좋지만 엔트로피가 충분하지 않은 경우에는 표시하지 않습니다. 리눅스가 많은 HRNG 장치에 대한 드라이버를 , 그리고에 축적된다 엔트로피 다양한에서 장치 (를 포함하여 입력 장치 등) 디스크 타이밍.

영구 저장소 (기밀)가있는 경우 위에서 설명한대로이 저장소를 사용하여 한 부팅에서 다음 부팅으로 엔트로피를 저장할 수 있습니다. 첫 번째 부팅 은 섬세한 시간입니다. 시스템은 그 시점에서 특히 예측 가능한 상태 일 수 있습니다. 특히 공장에서 본질적으로 동일한 방식으로 대량 생산되는 장치에서. 영구 저장소가있는 일부 내장형 장치는 공장에서 초기 시드로 제공됩니다 (공장의 컴퓨터에서 실행되는 RNG에 의해 생성됨). 가상화 된 서버 환경에서 호스트 또는 엔트로피 서버에서 가상 머신을 인스턴스화 할 때 초기 엔트로피를 프로비저닝 할 수 있습니다.

잘못 시드 된 장치는 실제로 널리 퍼져있는 문제 입니다. 공개 RSA 키에 대한 연구에 따르면 많은 서버와 장치에는 불량한 RNG로 생성 된 키가 있으며, 시드가 충분하지 않은 PRNG 일 가능성이 높습니다. OS 디자이너는이 문제를 스스로 해결할 수 없습니다. 배포 체인을 제어하는 ​​엔티티의 역할은 RNG가 처음 부팅 할 때 올바르게 시드 될 수 있도록하는 것 입니다. OS 디자이너로서의 임무는 첫 시드를 제공하는 인터페이스를 포함하여 적절한 RNG를 제공하고 RNG가 올바르게 시드되기 전에 RNG를 사용하는 경우 적절한 오류 신호를 보장하는 것입니다.


5
별이 빛나는 별 답니다.
Adam Maras

이것은 == 굉장합니다.

"정말로 무작위로 알려진 정보 출처는 없습니다"라고 동의하지 않습니다. 양자 역학에 대한 일반적인 (코펜하겐) 해석에 따르면 가능한 결과의 중첩에있는 시스템을 측정 한 결과는 결과를 예측할 수는 없지만 확률 분포를 제공 할 수 있다는 의미에서 무작위로 발생합니다 (최상의) . 출처 : 물리학 대학원생
balu

3

Gilles 답변 외에도 인터럽트를 사용하여 엔트로피를 설정할 수 있습니다. 예를 들어 Linux에서 인터럽트 핸들러를 추가 할 때이 인터럽트 발생을 커널의 엔트로피 풀에 대한 기여로 사용할지 여부를 정의 할 수 있습니다.

물론 이것은 공격자가 결정할 수있는 인터럽트의 경우에는 절대 안됩니다. 예를 들어 언뜻보기에 네트워크 트래픽 (즉, 결과적인 인터럽트)은 임의의 좋은 소스로 보입니다. 그러나 공격자는 작업에 필요한 임의성을 예측할 수있는 방식으로 트래픽을 조작 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.