/ dev / random과 / dev / urandom의 사용시기


답변:


79

TL; DR

/dev/urandom가장 실용적인 목적으로 사용하십시오 .

더 긴 대답은 실행중인 Unix의 맛에 달려 있습니다.

리눅스

역사적으로, /dev/random그리고 /dev/urandom모두 같은 시간에 소개되었다.

@DavidSchwartz 가 주석에서 지적했듯이 , /dev/urandom대부분의 경우 사용 이 선호됩니다. 그와 다른 사람들은 또한 내가 더 읽을 것을 권장하는 기사 에 대한/dev/urandom 훌륭한 신화에 대한 링크를 제공했습니다 .

요약하자면:

  • 맨은 오해의 소지가
  • 둘 다 동일한 CSPRNG 에 의해 공급되어 무작위성을 생성합니다 ( 다이어그램 2 및 3 ).
  • /dev/random 엔트로피 부족시 차단
  • 엔트로피의 양은 보수적으로 추정되지만 계산되지는 않습니다.
  • /dev/urandom읽지 않으면 /dev/random프로세스 실행이 중단 될 수 있습니다.
  • 드물지만 부팅 직후 CSPRNG에 엔트로피가 충분하지 않아 제대로 시드 /dev/urandom할 수없고 고품질 임의성이 생성되지 않을 수 있습니다.
  • CSPRNG가 처음에 제대로 시드 된 경우 엔트로피 부족이 문제가되지 않습니다.
  • CSPRNG는 지속적으로 다시 시드되고 있습니다
  • Linux 4.8 이상에서는에 /dev/urandom의해 사용되는 엔트로피 풀을 고갈시키지 않지만 /dev/random업스트림의 CSPRNG 출력을 사용합니다.
  • 사용하십시오 /dev/urandom.

규칙의 예외

에서 암호화 스택 교환의 사용시기 /dev/random를 통해 /dev/urandom리눅스에 @otus하는 두 개의 사용 사례가 있습니다 :

  1. 엔트로피가 충분하지 않은 경우 엔트로피가 낮은 장치에서 부팅 한 직후에는 제대로 시드 할 수 /dev/urandom있습니다.

  2. 정보 이론적 보안으로 일회성 패드 생성

(1)에 대해 걱정이되면 에서 사용할 수있는 엔트로피를 확인할 수 있습니다/dev/random .

당신이하고 있다면 (2) 이미 알고 있습니다 :)

참고 : / dev / random에서 읽는 것이 차단되는지 확인할 수 있지만 가능한 경쟁 조건에주의하십시오.

대안 : 둘 다 사용하지 마십시오!

@otus는 또한 초기 시드 엔트로피를 사용할 수없는 경우에만 getrandom()시스템이 시스템을 읽고 /dev/urandom차단 한다고 지적했습니다 .

있습니다 변화 문제 /dev/urandom사용할 수는getrandom() 있지만 새로운 것을 생각할 수있다 /dev/xrandom장치를 기반으로 생성됩니다 getrandom().

맥 OS

Wikipedia가 말한 것처럼 중요하지 않습니다 .

macOS는 SHA1 기반 160 비트 Yarrow를 사용합니다 . / dev / random과 / dev / urandom에는 차이가 없습니다. 둘 다 동일하게 동작합니다. Apple의 iOS는 Yarrow도 사용합니다.

FreeBSD

Wikipedia가 말한 것처럼 중요하지 않습니다 .

/dev/urandom/dev/random제대로 시드 될 때까지 의 링크 일뿐 입니다.

이것은 부팅 후 FreeBSD가 끝없는 랜덤의 흐름을 제공하기 전에 충분한 시드 엔트로피가 수집 될 때까지 기다릴 수있을 정도로 똑똑하다는 것을 의미합니다.

NetBSD

적절한 초기 시딩을 보장하기 위해 /dev/urandom시스템이 최소한 한 번 이상 읽었다 고 가정하고를 사용하십시오 /dev/random.

RND (4) 맨 페이지는 말한다 :

/dev/urandom 차단하지 마십시오.

/dev/random때때로 블록. 시스템 상태가 예측 가능한 것으로 알려진 경우 부팅시 조기에 차단됩니다.

응용 프로그램은 시뮬레이션을 위해 암호화 키 또는 시드와 같이 임의로 생성 된 데이터가 필요할 때 / dev / urandom에서 읽어야합니다.

예측 가능한 키 생성을 피하기 위해 인터넷과 통신하거나 암호화가 필요한 서비스를 실행하기 전에 부팅시 / dev / random에서 최소한 한 번 이상 시스템을 읽도록 시스템을 설계해야합니다.


BSD : Use/dev/urandom - /dev/urandomOpenBSD 와 같은 것이 없다는 것을 제외하고 . OpenBSD에는가 /dev/arandom있지만 그것을 사용해서는 안되며 arc4random(3)대신 함수를 사용해야합니다 . 아마도 모든 장치가 무엇인지 실제로 이해하는 사람들에게는 임의의 장치 및 기능에 대해 조언해야할까요?
Satō Katsura

1
@SatoKatsura 잘 잡았습니다. 견적을 반영하기 위해 FreeBSD로 업데이트되었습니다. 그 사람들이 누구인지 어떻게 결정하겠습니까?
Tom Hale

3
학문적 자격? 동료 검토 작업?
Satō Katsura

1
" /dev/random엔트로피 부족시 차단" -Linux에서는 장치를 여는 방법에 따라 다릅니다. open플래그가 포함 되면 O_NONBLOCK차단되지 않습니다. 엔트로피가 없으면 호출은 즉시 반환하고 읽은 0 바이트를 나타냅니다.

1
@TomHale이 행동은 덜 놀라운 IMO입니다. 경우 /dev/random60 바이트 :)에만 (예입니다, dd당신에게 60 바이트 파일을 제공 할 것입니다. head같은 시나리오에서 사용 하면 아마도 영원히 매달려있는 것처럼 보일 것입니다. 나도 당신이 원하는 것을하고 있지는 않지만 적어도 나에게 head기대했던 것을하지 않는 것이 더 분명합니다 .
Ryan J

5

전통적으로 사이의 유일한 차이 /dev/urandom와는 /dev/random커널이 시스템에는 엔트로피가없는 생각 때 발생하는 것입니다 - /dev/random폐쇄 실패, /dev/urandom개방 실패합니다. 두 드라이버 모두에서 엔트로피를 소싱하고 add_disk_randomness(), add_interrupt_randomness()하고 add_input_randomness(). 자세한 내용 /drivers/char/random.c은 참조하십시오 .

추가 편집 : Linux 4.8 /dev/urandom부터 CSPRNG를 사용하도록 재 작업되었습니다.

그렇다면 언제 폐쇄해야합니까? DRBG를 시드하는 모든 종류의 암호화 사용. /dev/urandomRSA 키를 생성 할 때 사용 하고 엔트로피가 충분하지 않은 경우의 결과를 설명하는 매우 유용한 논문이 있습니다 . 귀하의 P와 Q 채굴을 읽으십시오 .


5

이것은 "나도"대답이지만 Tom Hale의 추천을 강화합니다. Linux에도 적용됩니다.

  • 사용하다 /dev/urandom
  • 사용하지 마십시오 /dev/random

Linux Kernel Crypto 메일 링리스트에있는 Theodore Ts'o에 따르면 /dev/random, 10 년 동안 사용이 중단되었습니다. 에서 재 : [RFC 패치 V12 3/4] 리눅스 난수 생성기 :

실제로 아무도 / dev / random을 사용하지 않습니다. 기본적으로 더 이상 사용되지 않는 인터페이스입니다. 10 년 넘게 권장 된 주요 인터페이스는 / dev / urandom이며 현재는 getrandom (2)입니다.

우리는 정기적으로 테스트 /dev/random하며 자주 실패합니다. 테스트는 세 단계를 수행합니다. (1) /dev/random비 차단 모드에서 10K 바이트를 요청하여 드레인 ; (2) 블로킹 모드에서 16 바이트를 요청하십시오. (3) 블록을 압축하여 무작위 (가난한 사람의 테스트)인지 확인하십시오. 테스트를 완료하는 데 몇 분이 걸립니다.

이 문제는 Debain 시스템 (i686, x86_64, ARM 및 MIPS)에서 너무 나쁩니다. GCC Compile Farm에 rng-tools테스트 시스템 용 패키지 를 설치하도록 요청 했습니다. gcc67 및 gcc68에 rng-tools 설치 에서 :

rng-tools가 gcc67 및 gcc68에 설치되도록 요청하고 싶습니다. 그것들은 데비안 시스템이며 / dev / random은 장치를 사용하는 라이브러리를 고문 할 때 rng-tools없이 엔트로피 고갈을 겪습니다.

BSD와 OS X는 정상으로 보입니다. 문제는 확실히 리눅스입니다.


Linux가 생성기 실패를 기록하지 않는다는 것도 언급 할 가치가 있습니다. 항목이 시스템 로그를 채우는 것을 원하지 않았습니다. 현재까지 대부분의 장애는 조용하며 대부분의 사용자가 감지하지 못했습니다.

커널이 최소한 하나의 실패 메시지를 인쇄하기 때문에 상황이 곧 바뀔 것입니다. 에서 침묵 컴파일러 경고 및 수정 경주 : [PATCH] 임의 커널 암호화 메일 링리스트 :

구체적으로을 추가했습니다 depends on DEBUG_KERNEL. 이것은 이러한 유용한 경고가 다른 커널 개발자를 찌를 것임을 의미합니다. 이것은 아마도 우리가 원하는 것입니다. 다양한 관련 개발자가 특정 하위 시스템에서 경고가 표시되면 문제를 해결하는 데 더 많은 동기가 부여됩니다. 배포 커널의 일반 사용자는 일반적으로 DEBUG_KERNEL을 사용하지 않기 때문에 경고 나 스팸을 전혀 볼 수 없습니다.

보안 엔지니어링 관점에서 모든 메시지를 표시하지 않는 것이 좋습니다.

많은 사람들이 디버그 커널을 실행하지 않습니다. 문제를 알고 싶어하거나 알고 싶어하는 대부분의 사용자는 그 문제를 깨닫지 못할 것입니다. 우리가 systemd의 문제를 알게 된 이유는 dmesg 때문이었습니다.

모든 구성에서 모든 메시지를 표시하지 않으면 필요한 것보다 더 넓은 네트워크가 전송됩니다. 잠재적으로 감지되고 수정 될 수있는 구성은 눈에 띄지 않을 것입니다. 문제가 해결되지 않으면 해결되지 않습니다.

커널이 일부 조직에 대해 정책 결정을 내리는 것 같습니다. 효과적으로 고칠 수없는 하드웨어를 가진 사람들의 경우, 조직은 위험 역경에 따라 무엇을해야할지 결정해야합니다. 그들은 위험을 감수하기로 결정하거나 하드웨어를 새로 고칠 수 있습니다. 그러나 문제에 대한 정보가 없으면 실행 가능한 항목이 있음을 깨닫지 못할 수도 있습니다.

결국 스레드에서 도달 한 타협은 호출 모듈 당 하나 이상의 dmesg였습니다.

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