/dev/random
또는 사용해야합니까 /dev/urandom
?
어떤 상황에서 다른 것을 선호합니까?
/dev/random
또는 사용해야합니까 /dev/urandom
?
어떤 상황에서 다른 것을 선호합니까?
답변:
/dev/urandom
가장 실용적인 목적으로 사용하십시오 .
더 긴 대답은 실행중인 Unix의 맛에 달려 있습니다.
역사적으로, /dev/random
그리고 /dev/urandom
모두 같은 시간에 소개되었다.
@DavidSchwartz 가 주석에서 지적했듯이 , /dev/urandom
대부분의 경우 사용 이 선호됩니다. 그와 다른 사람들은 또한 내가 더 읽을 것을 권장하는 기사 에 대한/dev/urandom
훌륭한 신화에 대한 링크를 제공했습니다 .
요약하자면:
/dev/random
엔트로피 부족시 차단/dev/urandom
읽지 않으면 /dev/random
프로세스 실행이 중단 될 수 있습니다./dev/urandom
할 수없고 고품질 임의성이 생성되지 않을 수 있습니다./dev/urandom
의해 사용되는 엔트로피 풀을 고갈시키지 않지만 /dev/random
업스트림의 CSPRNG 출력을 사용합니다./dev/urandom
.규칙의 예외
에서 암호화 스택 교환의 사용시기 /dev/random
를 통해 /dev/urandom
리눅스에
@otus하는 두 개의 사용 사례가 있습니다 :
엔트로피가 충분하지 않은 경우 엔트로피가 낮은 장치에서 부팅 한 직후에는 제대로 시드 할 수 /dev/urandom
있습니다.
(1)에 대해 걱정이되면 에서 사용할 수있는 엔트로피를 확인할 수 있습니다/dev/random
.
당신이하고 있다면 (2) 이미 알고 있습니다 :)
참고 : / dev / random에서 읽는 것이 차단되는지 확인할 수 있지만 가능한 경쟁 조건에주의하십시오.
대안 : 둘 다 사용하지 마십시오!
@otus는 또한 초기 시드 엔트로피를 사용할 수없는 경우에만 getrandom()
시스템이 시스템을 읽고 /dev/urandom
차단 한다고 지적했습니다 .
있습니다 변화 문제 /dev/urandom
사용할 수는getrandom()
있지만 새로운 것을 생각할 수있다 /dev/xrandom
장치를 기반으로 생성됩니다 getrandom()
.
Wikipedia가 말한 것처럼 중요하지 않습니다 .
macOS는 SHA1 기반 160 비트 Yarrow를 사용합니다 . / dev / random과 / dev / urandom에는 차이가 없습니다. 둘 다 동일하게 동작합니다. Apple의 iOS는 Yarrow도 사용합니다.
Wikipedia가 말한 것처럼 중요하지 않습니다 .
/dev/urandom
/dev/random
제대로 시드 될 때까지 의 링크 일뿐 입니다.
이것은 부팅 후 FreeBSD가 끝없는 랜덤의 흐름을 제공하기 전에 충분한 시드 엔트로피가 수집 될 때까지 기다릴 수있을 정도로 똑똑하다는 것을 의미합니다.
적절한 초기 시딩을 보장하기 위해 /dev/urandom
시스템이 최소한 한 번 이상 읽었다 고 가정하고를 사용하십시오 /dev/random
.
/dev/urandom
차단하지 마십시오.
/dev/random
때때로 블록. 시스템 상태가 예측 가능한 것으로 알려진 경우 부팅시 조기에 차단됩니다.응용 프로그램은 시뮬레이션을 위해 암호화 키 또는 시드와 같이 임의로 생성 된 데이터가 필요할 때 / dev / urandom에서 읽어야합니다.
예측 가능한 키 생성을 피하기 위해 인터넷과 통신하거나 암호화가 필요한 서비스를 실행하기 전에 부팅시 / dev / random에서 최소한 한 번 이상 시스템을 읽도록 시스템을 설계해야합니다.
/dev/urandom
- /dev/urandom
OpenBSD 와 같은 것이 없다는 것을 제외하고 . OpenBSD에는가 /dev/arandom
있지만 그것을 사용해서는 안되며 arc4random(3)
대신 함수를 사용해야합니다 . 아마도 모든 장치가 무엇인지 실제로 이해하는 사람들에게는 임의의 장치 및 기능에 대해 조언해야할까요?
/dev/random
엔트로피 부족시 차단" -Linux에서는 장치를 여는 방법에 따라 다릅니다. open
플래그가 포함 되면 O_NONBLOCK
차단되지 않습니다. 엔트로피가 없으면 호출은 즉시 반환하고 읽은 0 바이트를 나타냅니다.
/dev/random
60 바이트 :)에만 (예입니다, dd
당신에게 60 바이트 파일을 제공 할 것입니다. head
같은 시나리오에서 사용 하면 아마도 영원히 매달려있는 것처럼 보일 것입니다. 나도 당신이 원하는 것을하고 있지는 않지만 적어도 나에게 head
기대했던 것을하지 않는 것이 더 분명합니다 .
전통적으로 사이의 유일한 차이 /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/urandom
RSA 키를 생성 할 때 사용 하고 엔트로피가 충분하지 않은 경우의 결과를 설명하는 매우 유용한 논문이 있습니다 . 귀하의 P와 Q 채굴을 읽으십시오 .
이것은 "나도"대답이지만 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였습니다.