Amazon Linux 2에서 CSPRNG 사용

Amazon Linux 2에서 CSPRNG 사용

암호화가 강력하고(인증 요구 사항) 고품질(업계 표준 무작위성 테스트 통과), 합리적인 성능(아래 참조)을 갖춘 PRNG를 사용해야 합니다.

처음에는 최신 Ubuntu LTS에서 실행될 것이라고 생각했고 /dev/urandom내 정보에 따르면 커널 버전 5.18의 모든 기준을 충족하는 것 같아서 읽어볼 계획이었습니다.

성능 측면에서 { timeout --foreground 1s cat /dev/urandom; } | wc -cM1 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에서 제거되었습니다).

관련 정보