암호화가 강력하고(인증 요구 사항) 고품질(업계 표준 무작위성 테스트 통과), 합리적인 성능(아래 참조)을 갖춘 PRNG를 사용해야 합니다.
처음에는 최신 Ubuntu LTS에서 실행될 것이라고 생각했고 /dev/urandom
내 정보에 따르면 커널 버전 5.18의 모든 기준을 충족하는 것 같아서 읽어볼 계획이었습니다.
성능 측면에서 { timeout --foreground 1s cat /dev/urandom; } | wc -c
M1 Mac(FYI)에서 실행하면 약 450MB/s의 처리량이 달성되었으며 x86-64 Ubuntu 22.04.2 LTS VM에서도 비슷한 결과를 얻었습니다.
40kB 블록을 읽는 C++ 프로그램은 약 1GB/초의 더 높은 처리량을 달성했지만 실행 파일을 컴파일하고 실행할 수 없었습니다(비록 쉘 명령과 실행 파일 간의 비율이 비슷하다고 가정하지만).
그러나 가상 머신에서 실행되는 Amazon Linux 2(커널 버전 5.10)에 배포될 것으로 밝혀졌습니다.알고리즘의그리고성능RNG 개선은 사용할 수 없습니다.
내 질문은 다음과 같습니다
- 가상 머신에서 실행되는 커널 5.10은
/dev/urandom
암호화된 강력한 의사 난수를 제공하고 최소 1MB/초의 처리량으로 업계 표준 무작위성 테스트를 통과해야 하는 원래 요구 사항을 여전히 충족합니까?
관련 환경에 액세스할 수 없지만 이전 커널 버전에서 여러 온라인 셸을 사용하려고 하면 여러 시스템(커널 5.4, 그리고커널 5.15/dev/random
) 동일한 처리량을 얻었고 /dev/urandom
내 이해로는 동일한 품질을 의미하지만 다른 시스템에서도커널 5.4)가 /dev/random
차단되고 0~200B/s 사이의 결과를 제공합니다(예:바이트, 접두사 없음), 이는 /dev/urandom
품질 저하를 나타냅니다(제가 잘못 이해한 것이 아니라면).
그러나 따르면필로닉스,"Linux 5.6 /dev/random은 이제 /dev/urandom이 사용자 공간에서 RNG 데이터를 폴링하는 데 사용되는 것처럼 동작합니다. 변경된 동작으로 인해 /dev/random이 /dev/urandom과 동일하게 동작하게 됩니다. 단, CRNG(Linux 암호화 강도 난수 생성기)가 준비될 때까지 읽기가 차단된다는 점이 다릅니다. 한편 /dev/urandom은 계속해서 최상의 데이터를 제공하지만 차단되지는 않습니다.”, 따라서 위의 커널 5.4를 사용한 테스트는 이 경우에는 유효하지 않을 수 있습니다.
그래서것 같다도망칠 수도 있을 것 같지만 잘 모르겠습니다.
- 임의의 더미 파일을 사용하는 것이 옵션이 아닌 것으로 밝혀지면 위의 상자를 선택하기 위한 어떤 대안이 있습니까? OpenSSL을 알아보세요랜드_바이트요구 사항을 충족합니까?
답변1
내가 아는 한, /dev/urandom
그것은 얻어졌다.충분하다CSPRNG는 5.4에도 있습니다(ChaCha20을 사용하도록 포팅되었습니다).존재하다4.8, 그리고 둘 다동일한 CSPRNG에서 지원되는 장치).
이후 변경 사항의 더 큰 초점은 RNG 자체의 개선에 있지 않았습니다(많은 개선이 이루어졌지만).알아내다CSPRNG는 실제로 충분하므로 "엔트로피 계산으로 인한 차단" 동작을 제거합니다 /dev/random
. 특히 CSPRNG가 필요하지 않을 정도로 충분하다는 데 동의했기 때문입니다.
즉, 내 이해에 따르면 5.10의 /dev/urandom은 /dev/random
,뒤쪽에해당 CSPRNG가 초기화되었습니다. 하지만 이것이 발생했는지 여부를 사용자 공간에 표시하지는 않습니다.
더 나은 옵션은 getrandom(2) 시스템 호출(3.something부터 사용 가능)일 수 있습니다. 이는 "두 세계의 최고"(일명 새로운 5.18 /dev/random
동작)를 제공하는 것으로 보입니다. 플래그로 0을 지정하면 다음과 같은 경우 차단됩니다. CSPRNG는 아직 준비되지 않았지만 나중에 차단되지 않습니다.
그러나 사용자 공간 CSPRNG는 컨텍스트 전환이 없기 때문에 항상 더 빠릅니다.매우일반적 으로 OpenSSL RAND_bytes() 또는 선택한 암호화 라이브러리에서 제공하는 다른 항목을 사용하거나 시드합니다 /dev/urandom
. getrandom()
(최신 OpenSSL 3.0은 getrandom()
이 작업을 자동으로 수행하므로 수동으로 시드할 필요가 없습니다.)
(참고: pv /dev/urandom > /dev/null
좋은 측정을 위해 Westmere에서 Comet Lake까지 근처의 다양한 x86 서버와 ARM64 Ampere Altra의 VPS에서 테스트했는데,모두동일한 300~400MB/s 달성. )
/dev/random은 차단되고 0-200B/s(즉, 바이트, 접두사 없음) 사이의 결과를 제공합니다. 이는 /dev/urandom의 품질이 저하되었음을 나타냅니다(제가 잘못 이해한 것이 아닌 한).
최근 변경 사항의 초점은 /dev/urandom의 품질을 인식하는 것이라고 생각합니다.아니요좋은 CSPRNG 지원이 있었다면 성능이 저하되고 /dev/random에 의해 수행된 계산은 의미가 없게 됩니다(그래서 5.6에서 제거되었습니다).