/dev/module

/dev/random
/dev/urandom의 256바이트 16진수 덤프

Unix유사한 운영 체제에서 /dev/random, /dev/urandom/dev/arandom의사 난수 생성기 역할을 하는 특수 파일입니다.디바이스 드라이버나 다른 소스로부터 [1]수집된 환경 노이즈에 액세스 할 수 있습니다./dev/random은 일반적으로 사용 가능한 엔트로피가 요구된 것보다 을 경우 차단됩니다.최근에는 (아래에 있는 OS에 따라) 충분한 엔트로피가 수집될 때까지 차단한 후 영구적으로 차단 해제됩니다./dev/urandom 디바이스는 보통 블로킹디바이스가 아닙니다.부팅 후 pseudorandom number generator seed가 엔트로피로 완전히 초기화되지 않은 경우에도 마찬가지입니다./dev/arandom은 충분한 엔트로피로 시드가 안전하게 초기화될 때까지 부트 후 차단한 후 다시 차단하지 않습니다.모든 운영 체제가 /dev/random과 /dev/urandom에 동일한 메서드를 구현하는 것은 아니며 일부 운영 체제만이 /dev/arandom을 제공합니다.

> hexdump - C - n 8 / dev / random 0000000 79 5d 13 c2 b4 fe ca d7 y ]â â â > hexdump - C - n 8 / dev / random 0000000 bd f1 6d 48 10 f8 25 3c..mH..%< 

이 셸 스크립트는 인쇄 가능한 임의의 문자 생성기로 약간 편향되어 있습니다.

#!/bin/sh printf " \$ti", pngs </dev/urandom; pc=1; while [$pc -le $(((${#pngs}%5)+8)], s2 </dev/urandom; printf "\n\n"; printfrintf "\%o(#%)($)읽습니다.'; l=${#s}; i=1; 반면 [$i -le $l]; c='printf %c "${s%${s#?}'; s=${s#?}; cc="printf %d \"printf "\047$c" 2>&"; printf "\%o" "$(((cc+i)%95)+32)")"'; i=$((i+1); 완료; pc=$((pc+1); 완료;

리눅스

Rngtest 테스트 /dev/random 풀

커널 공간의 난수 생성은 1994년 시어도어 조에 [3]의해 Linux에 최초[2] 구현되었습니다.이 구현에서는 암호 [clarification needed]대신 보안 해시를 사용하여 제너레이터를 처음 설계할 때 적용되었던 암호화 내보내기 제한을 피했습니다.또, 이 실장에서는, 어떠한 해시나 암호도 최종적으로 약한 것이 판명되는 것을 전제로 설계되어 있기 때문에, 그러한 약점에 직면해도 설계는 내구성이 있습니다.손상으로부터의 신속한 복구는 요건으로 간주되지 않습니다.풀 손상 요건은 운영 체제의 관련 없는 부분에 대한 훨씬 쉽고 직접적인 공격에 충분하기 때문입니다.

Tso의 구현에서 제너레이터는 엔트로피 풀의 노이즈 비트 수의 추정치를 유지합니다.이 엔트로피 풀로부터 난수가 생성됩니다.읽으면 /dev/random 디바이스는 엔트로피 풀의 예상 노이즈 비트 수 내에서 랜덤바이트만 반환합니다.엔트로피 풀이 비어 있는 경우 /dev/random의 읽기는 추가적인 환경 노이즈가 [4]수집될 때까지 차단됩니다. 목적은 암호학적으로 안전한 의사 난수 생성기로서 가능한 한 큰 엔트로피로 출력을 전달하는 것입니다.이는 고부가가치 또는 장기적인 [4]보호를 위해 암호 키를 생성하는 데 사용하기 위해 저자가 제안하는 것입니다.

/dev/random에 대응하는 것은 /dev/urandom("무제한/[5]비블로킹 랜덤[4] 소스")이며, 내부 풀을 재사용하여 더 많은 의사 랜덤 비트를 생성합니다.즉, 콜은 차단되지 않지만 출력에 포함된 엔트로피가 /dev/random의 대응하는 읽기보다 적을 수 있습니다./dev/urandom은 여전히 대부분의 암호화 목적에 적합한 의사 난수 생성기를 의도하고 있지만, 대응하는 man 페이지의 작성자들은 이론적으로 /dev/urandom에서 사용되는 알고리즘에 아직 공개되지 않은 공격이 존재할 수 있으며, 이러한 공격에 대해 우려하는 사용자는 대신 /[4]dev/random을 사용해야 한다고 지적합니다.그러나 엔트로피 풀을 예측할 수 없게 되면 보안이 비트 [6]수만큼 누출되지 않기 때문에 이러한 공격이 발생할 가능성은 거의 없습니다.

/dev/random에 쓸 수도 있습니다.이를 통해 임의의 사용자가 임의의 데이터를 풀에 혼재시킬 수 있습니다.비랜덤 데이터는 [dubious ]무해합니다.특권 사용자만이 엔트로피 추정치를 높이는 데 필요한 ioctl을 발행할 수 있기 때문입니다.Linux 커널 엔트로피 풀의 현재 엔트로피 양과 크기는 모두 비트 단위로 측정되며 /proc/sys/kernel/random/에서 사용할 수 있으며 명령으로 표시할 수 있습니다.cat /proc/sys/kernel/random/entropy_avail그리고.cat /proc/sys/kernel/random/poolsize각각 다음과 같다.

Gotherman, Pinkas 및 Reinman은 2006년 3월에 Linux 난수[7] 생성기의 상세한 암호화 분석을 발표했습니다.이 분석에서는 몇 가지 약점을 설명하고 있습니다.아마도 가장 심각한 문제는 라우터나 디스크리스 클라이언트 등의 임베디드 CD 시스템 또는 라이브 CD 시스템일 것입니다.이 시스템에서는 부트업 상태가 예측 가능하며 환경으로부터의 엔트로피 공급이 제한될 수 있습니다.비휘발성 메모리를 탑재한 시스템의 경우, 셧다운시에 RNG로부터 상태를 보존해, 다음에 재기동했을 때에 RNG 상태가 되도록 하는 것을 추천합니다.네트워크 트래픽이 사용 가능한 엔트로피의 프라이머리 소스를 나타내는 라우터의 경우, 리부트 후에 상태를 보존하면, 라우터가 최초로 가동되었을 때부터 잠재적인 공격자가 「모든 네트워크트래픽을 도청하거나, 라우터의 내부 스테이트에 직접 액세스 할 필요가 있습니다」라고 하는 점에 주의합니다.이 문제는 네트워크트래픽을 원거리에서 캡처할 수 있고 RNG를 사용하여 데이터 암호화용 키를 생성할 수 있는 무선 라우터의 경우 특히 중요합니다.

Linux 커널은 설치된 여러 하드웨어 난수 생성기를 지원합니다.이러한 디바이스의 raw 출력은 /dev/[8]hwrng에서 얻을 수 있습니다.

Linux 커널 3.16 [9]이후에서는 HWRNG의 정의 가능한 엔트로피 추정 품질에 따라 커널 자체가 하드웨어 난수 생성기에서 /dev/random으로 데이터를 혼합합니다.이것은 이 작업을 수행하기 위해 rng-toolsrngd와 같은 사용자 공간 데몬이 필요하지 않음을 의미합니다.Linux 커널 3.17+에서는 Virt의IO RNG는 0 [10]위에 정의된 기본 품질을 갖도록 수정되었으며, 따라서 현재 /dev/random에 기본적으로 혼합된 유일한 HWRNG입니다.

엔트로피 풀은 timer_entropyd, hazged, randomsound 등의 프로그램으로 개선할 수 있습니다.rng-tools사용하면 엔트로피 키 등의 하드웨어 난수 생성기가 /dev/random에 쓸 수 있습니다.다이하드 테스트 프로그램은 다이하드 테스트, 다이하드 테스트 및 ent는 이들 난수 [11][12][13][14]생성기를 테스트할 수 있습니다.

2014년 1월, Daniel J. Bernstein은 Linux가 다양한 엔트로피 소스를 혼합하는 방법에 대한 비판을[15] 발표했습니다.그는 엔트로피의 다른 원천을 감시할 수 있는 엔트로피의 원천이 엔트로피의 다른 원천의 무작위성을 없애기 위해 엔트로피의 출력을 수정할 수 있는 공격의 개요를 설명한다.H ( , , ) { H ( , , )여기 H는 해시 함수이고 x , y , zCPU 기반의 악의적인 HRNG Z의 출력인 엔트로피의 소스입니다.

  1. Z는 r의 랜덤 값을 생성합니다.
  2. ZH ( , , H , )를
  3. H( , ,) \ H , )의 이 원하는 값과 같으면 r을 z출력합니다.
  4. 그렇지 않으면 1부터 반복합니다.

Bernstein은 공격자가 DSA와 ECDSA를 시키려면 r16회 반복해야 한다고 추정했습니다.이는 Linux가 단일 고품질 시드를 사용하는 대신 H를 지속적으로 재시드하기 때문에 가능합니다.

2016년 10월 리눅스 커널 버전 4.8의 출시와 함께 커널의 /dev/urandom은 번스타인의 잘 알려진 스트림 암호 ChaCha20에 기반ChaCha20 기반암호화 의사andom 번호 생성기(CPRNG) 구현으로[16] 전환되었다.

2020년에 Linux 커널 버전 5.6 /dev/random은 CPRNG가 초기화되지 않은 경우에만 차단합니다.초기화되면 /dev/random /dev/urandom은 동일하게 [17]동작합니다.

BSD 시스템

프리비SD 운영체제는 /dev/urandom에 대한 /dev/urandom 링크를 제공합니다.둘 다 적절히 씨앗이 뿌려질 때까지 막는다.FreeBSD의 PRNG(Fortuna)는 정기적으로 리시드하며 엔트로피를 추정하지 않습니다.네트워크와 디스크의 액티비티가 적은 시스템에서는 몇 초 후에 리시딩이 이루어집니다.

OpenBSD 5.1(2012년 5월 1일) /dev/random/dev/arandomRC4 기반 알고리즘을 사용하지만 지적 재산상의 이유로 이름이 ARC4로 변경되었습니다.여기서 난수 생성은 몇 가지 방법으로 수집된 시스템 엔트로피를 사용하는 반면, ARC4 알고리즘은 Fail-safe를 제공하여 풀이 낮은 엔트로피 상태에서도 신속하고 고품질의 의사 난수 스트림을 제공합니다.시스템은 OpenBSD 암호화 프레임워크를 통해 하드웨어 난수 생성기(일부 인텔 PCI 허브에 있는 생성기 등)를 자동으로 사용합니다.OpenBSD 5.5(2014년 5월 1일) 현재arc4random()OpenB에 사용되는 콜SD의 랜덤 디바이스는 ARC4를 사용하지 않게 되었습니다만, ChaCha20(arc4random명[18][19]랜덤의 대체 콜로서 재검토될 가능성이 있습니다).

NetBSD의 레거시 구현arc4random()API도 [20]ChaCha20으로 전환되었습니다.

MacOS, iOS 및 기타 Apple OS

모든 Apple OS는 적어도 2019년 12월 이후, 아마도 [21]더 이른 시점부터 Fortuna로 이전되었습니다.SHA-256에 근거하고 있습니다.시큐어 인클로저 RNG, 부트 페이즈 타이밍 지터, 하드웨어 인터럽트(타이밍 가정)등의 복수의 엔트로피 소스가 사용됩니다.RDSEED/RDRAND는 RDSEED/RDRAND를 지원하는 인텔 기반 Mac에서 사용됩니다.시드(엔트로피) 데이터도 후속 재부팅을 위해 저장됩니다.

변경 전 macOS와 iOS는 SHA-1[22]기반으로 한 160비트 Yarrow를 사용했습니다.

/dev/random /dev/urandom 모두 동일하게 동작합니다.[23][24]

기타 운영 체제

/[25]dev/random 및 /dev/urandom은 Solaris, NetBSD,[26] Tru64 UNIX 5.1B,[27] AIX 5.2[28] 및 HP-UX 11i v2에서도 사용할 수 있습니다.[29]FreeBSD와 마찬가지로 AIX는 자체 Yarrow 기반 설계를 구현하지만 AIX는 표준 /dev/random 구현보다 훨씬 적은 엔트로피 소스를 사용하며 충분한 [30]엔트로피를 포함한다고 판단되면 풀 재충전을 중지합니다.

Windows NT 에서는, 같은 기능이 ksecd.sys 에 의해서 제공되고 있습니다만, 특수 파일 \Device\KsecDD 를 읽어내는 것은 UNIX 와 같이 동작하지 않습니다.암호로 랜덤한 바이트를 생성하는 문서화된 방법은 CryptGenRandomRtlGenRandom입니다.

DOS는 당연히 이러한 기능을 제공하지 않지만, 노이즈라고 하는 오픈 소스 서드 파티 드라이버가 있습니다.sys[31]RANDOM$와 URANDOM$라는 두 개의 디바이스를 생성한다는 점에서 동일하게 기능하며 /DEV/RANDOM$ /DEV/URANDOM$로도 액세스할 수 있습니다.

Windows의 Cygwin스크립트 및 프로그램에서 사용할 수 있는 /dev/[32]random과 /dev/urandom을 모두 구현합니다.

대체 수단으로서의 EGD

EGD(엔트로피 수집 데몬)라고 하는 소프트웨어 프로그램은 /dev/random 장치를 지원하지 않는 UNIX 시스템의 일반적인 대체 프로그램입니다.고품질의 암호화 랜덤 데이터를 제공하는[citation needed] 사용자 스페이서에몬입니다.OpenSSL, GNU Privacy Guard, Apache HTTP Server 의 일부 암호화 소프트웨어는 /dev/random 디바이스를 사용할 수 없는 경우 EGD 사용을 지원합니다.OpenSSL 1.1.0에서는 기본적으로 EGD 데몬 지원이 비활성화되어 있습니다.어플리케이션에서는 를 사용하여 지원 여부를 확인해야 합니다.OPENSSL_NO_EGD프리프로세서 매크로

EGD는 다양한 소스에서 랜덤 엔트로피를 수집하여 편견을 제거하고 암호화 품질을 개선하기 위해 처리한 후 UNIX 도메인 소켓(/dev/egd-pool이 일반적인 선택) 또는 TCP [33]소켓을 통해 사용할 수 있도록 합니다.엔트로피 수집에는 일반적으로 CPU, I/O 및 네트워크 사용률 모니터링 및 다양한 로그 파일 및 임시 디렉토리의 내용 등 자주 변경되거나 예측할 수 없는 시스템의 속성을 쿼리하는 서브프로세스가 정기적으로 수반됩니다.

대체 [34]PRNGD는 호환되는 의사 랜덤 소스입니다.

EGD는 간단한 프로토콜을 사용하여 랜덤 데이터가 필요한 다른 프로그램과 통신합니다.클라이언트는 EGD 소켓에 접속하여 첫 번째 옥텟 값으로 식별되는 명령을 전송합니다.

  • 명령 0: 현재 사용 가능한 엔트로피의 양을 쿼리합니다.EGD 데몬은 지연 없이 현재 충족될 수 있는 랜덤바이트 수를 나타내는 빅엔디안 형식의 4바이트 숫자를 반환합니다.
  • 명령어 1: 랜덤바이트 취득, 블로킹 없음요청의 두 번째 바이트는 1 ~255의 랜덤한 출력 바이트 수를 EGD에 나타냅니다.EGD에 엔트로피가 부족하여 요구를 즉시 충족할 수 없는 경우 반환되는 바이트 수가 감소하거나 바이트 수가 없을 수 있습니다.응답의 첫 번째 옥텟은 응답 직후에 랜덤데이터를 포함한 추가 바이트 수를 나타냅니다.
  • 명령어 2: 랜덤바이트 취득, 블로킹두 번째 바이트는 EGD가 반환해야 하는 출력의 랜덤바이트 수를 나타냅니다.EGD에 충분한 엔트로피가 없는 경우 EGD는 충분히 수집될 때까지 대기한 후 응답합니다.명령어 1과 달리 응답은 즉시 길이 옥텟이 아닌 랜덤바이트로 시작됩니다.이는 반환되는 데이터의 총 길이가 요청된 양과 달라지지 않기 때문입니다.
  • 명령 3: 엔트로피를 업데이트합니다.이 명령어를 사용하면 클라이언트는 EGD의 내부 풀에 추가할 엔트로피를 추가할 수 있습니다.다음 2바이트는 16비트의 빅엔디안 정수로 해석되며 발신자가 제공하는 랜덤성의 비트수를 나타냅니다.네 번째 바이트는 요청에 따라 추가 소스 데이터 바이트 수를 나타냅니다.EGD 데몬은 수신된 엔트로피를 혼합하여 아무것도 반환하지 않을 수 있습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Torvalds, Linus (2005-04-16). "Linux Kernel drivers/char/random.c comment documentation @ 1da177e4". Retrieved 2014-07-22.
  2. ^ Lloyd, Jack (2008-12-09). "On Syllable's /dev/random". Retrieved 2019-08-21.
  3. ^ "/dev/random". Everything2. 2003-06-08. Archived from the original on 2009-11-17. Retrieved 2013-07-03.
  4. ^ a b c d random(4)Linux 프로그래머 매뉴얼– 특수 파일
  5. ^ "/dev/random and /dev/urandom implementation in Linux 1.3.39, function random_read_unlimited". 1995-11-04. Retrieved 2013-11-21.
  6. ^ Filippo Valsorda (2015-12-29). The plain simple reality of entropy.
  7. ^ Gutterman, Zvi; Pinkas, Benny; Reinman, Tzachy (2006-03-06). "Analysis of the Linux Random Number Generator" (PDF). Archived (PDF) from the original on 2008-10-03. Retrieved 2013-07-03.
  8. ^ "Cryptography Users Guide". Texas Instruments. 2013-06-04. Archived from the original on 2018-04-16. Retrieved 2013-07-03.
  9. ^ "kernel/git/torvalds/linux.git - Linux kernel source tree @ be4000bc4644d027c519b6361f5ae3bbfc52c347 "hwrng: create filler thread"". Git.kernel.org. Retrieved 18 October 2016.
  10. ^ "kernel/git/torvalds/linux.git - Linux kernel source tree @ 34679ec7a0c45da8161507e1f2e1f72749dfd85c "virtio: rng: add derating factor for use by hwrng core"". Git.kernel.org. Retrieved 18 October 2016.
  11. ^ "??". Vanheusden.com. Archived from the original on 2013-09-21. Retrieved 2016-10-23.
  12. ^ "Google Code Archive for dieharder". Code.google.com. Retrieved 18 October 2016.
  13. ^ "The Marsaglia Random Number CDROM including the Diehard Battery of Tests of Randomness". Stat.fsu.edu. Archived from the original on 2016-01-25. Retrieved 2016-10-23.
  14. ^ "rng-tools". Gnu.org. Retrieved 2016-10-23.
  15. ^ Daniel J. Bernstein (2014-02-05). "cr.yp.to: 2014.02.05: Entropy Attacks!".
  16. ^ "kernel/git/torvalds/linux.git - Linux kernel source tree". kernel.org. 2016-07-27. Retrieved 2016-11-23.
  17. ^ "/dev/random Is More Like /dev/urandom With Linux 5.6 - Phoronix". www.phoronix.com.
  18. ^ arc4random(3)OpenBSD 라이브러리 기능 매뉴얼
  19. ^ deraadt, ed. (2014-07-21). "libc/crypt/arc4random.c". BSD Cross Reference, OpenBSD src/lib/. Retrieved 2015-01-13. ChaCha based random number generator for OpenBSD.
  20. ^ riastradh, ed. (2014-11-16). "libc/gen/arc4random.c". BSD Cross Reference, NetBSD src/lib/. Retrieved 2015-01-13. Legacy arc4random(3) API from OpenBSD reimplemented using the ChaCha20 PRF, with per-thread state.
  21. ^ "Apple Platform Security". Apple Inc.
  22. ^ "xnu-1456.1.26/bsd/dev/random". Apple Inc. Retrieved 18 October 2016.
  23. ^ random(4)DarwinmacOS 커널 인터페이스 설명서
  24. ^ "iOS Security" (PDF). Apple Inc. October 2012. Archived from the original (PDF) on April 5, 2014. Retrieved May 27, 2015.
  25. ^ Moffat, Darren (2013-09-12). "Solaris Random Number Generation". Oracle Solaris Blog. Retrieved 2022-04-30.
  26. ^ rnd(4)NetBSD 커널 인터페이스 매뉴얼
  27. ^ "random(4)". 1999-09-19. Retrieved 2013-07-03.
  28. ^ "random and urandom Devices". pSeries and AIX Information Center. 2010-03-15. Archived from the original on 2021-03-03. Retrieved 2013-07-03.
  29. ^ "HP-UX Strong Random Number Generator". 2004-07-23. Retrieved 2013-07-03.
  30. ^ Roberts, Iain (2003-04-25). "AIX 5.2 /dev/random and /dev/urandom devices". Lists.gnupg.org. Archived from the original on 2012-02-22. Retrieved 2013-07-03.
  31. ^ "DOS ports". Doug Kaufman's Web Site. 2006-11-02. Archived from the original on 2006-12-29. Retrieved 2013-07-03.
  32. ^ "How does Cygwin's /dev/random and urandom work?". www.linuxquestions.org. Retrieved 2018-03-09.
  33. ^ Warner, Brian (2002-07-25). "EGD: The Entropy Gathering Daemon". Retrieved 2013-07-03.
  34. ^ Jänicke, Lutz (2007-01-12). "PRNGD - Pseudo Random Number Generator Daemon". Retrieved 2013-07-03.

외부 링크