느린 SecureRandom 제너레이터에 대처하는 방법
" " " 를 합니다.SecureRandom
SecureRandom
을 사용하다「」를하고 있는 /dev/random
Linux 에서는 충분한 엔트로피가 생성되기를 기다리는 것을 차단할 수 있습니다.적적 위위 ?떻 떻? ???
이 문제의 해결책으로 비범한 수학을 사용한 사람이 있습니까?
JDK 6에서 이 성능 문제가 해결되었는지 확인할 수 있는 사람이 있습니까?
다음을 사용하여 Linux에서 더 빠르지만 약간 보안이 낮은 /dev/urandom을 선택할 수 있습니다.
-Djava.security.egd=file:/dev/urandom
단, Java 5 이후에서는 동작하지 않습니다(Java Bug 6202721)권장되는 회피책은 다음과 같습니다.
-Djava.security.egd=file:/dev/./urandom
(「」를 해 주세요)/./
)
실제 랜덤 데이터를 원하는 경우 안타깝게도 데이터를 기다려야 합니다.에는 기에에 for for for for for for for for for for for for for for for for의 을 포함한다.SecureRandom
비범한 은 PRNG보다 더 수 .SecureRandom
단, 특정 웹사이트에서 시드 데이터를 다운로드하기 위해 인터넷에 연결할 수 있습니다.으로는 이 가 더 것 ./dev/random
아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 네.
PRNG 를 사용하는 경우는, 다음과 같이 실시합니다.
SecureRandom.getInstance("SHA1PRNG");
은 ""에 따라 .SecureRandom
공급자는 SPI를 사용하여 할 수 .Security.getProviders()
★★★★★★★★★★★★★★★★★」Provider.getService()
.
Sun은 SHA1PRNG를 좋아하기 때문에 널리 보급되어 있습니다.PRNG는 특별히 빠르지 않지만 PRNG는 엔트로피의 물리적 측정을 위해 차단하는 것이 아니라 숫자를 계산하기 위한 것입니다.
는, 전화하지입니다.setSeed()
에, 는, 최초로 「PRNG」를 호출했을 .next()
★★★★★★★★★★★★★★★★★」nextBytes()
이것은, 통상, 시스템의 진정한 랜덤 데이터를 소량 사용해 행해집니다.이 콜은 차단될 수 있지만 랜덤 번호의 소스는 "현재 시간을 PID와 함께 해시하고 27을 추가하여 최선의 선택을 바란다"의 어떤 변형보다 훨씬 안전합니다.것은 할 수 , 안전하지
Linux의 입니다.SecureRandom
NativePRNG
(여기서는 소스 코드), 매우 느린 경향이 있습니다.Windows 에서는, 디폴트는 다음과 같습니다.SHA1PRNG
다른 사람들이 지적한 것처럼 명시적으로 지정하면 Linux에서도 사용할 수 있습니다.
NativePRNG
SHA1PRNG
및 Uncommons Maths의 AESCounter운영체제로부터 지속적으로 엔트로피를 수신하는 RNG(읽기)/dev/urandom
다른 PRNG는 시드 후 엔트로피를 추가로 획득하지 않습니다.
AES 는 RNG 보다 약 10배 빠릅니다.SHA1PRNG
는 IIRC보다 2, NativePRNG
.
초기화 후에 엔트로피를 취득하는 고속 PRNG가 필요한 경우는, Fortuna의 Java 실장을 찾을 수 있는지 확인해 주세요.Fortuna 구현의 핵심 PRNG는 AESCounterRNG에서 사용하는 PRNG와 동일하지만 엔트로피 풀링과 자동 재시딩의 정교한 시스템도 있습니다.
많은 디스트로스( 기반 디스트로스(Debian) OpenJDK를 하도록 OpenJDK를 합니다./dev/random
트트엔엔
/dev/random
기본적으로 느리다(또한 차단할 수도 있다).
여기서 차단 해제 방법에는 다음 두 가지 옵션이 있습니다.
- 엔트로피 개선 또는
- 랜덤성 요건을 삭감합니다.
옵션 1, 엔트로피 개선
를 더 얻기 /dev/random
해지 데몬을 시험합니다.HAVEGE 엔트로피를 지속적으로 수집하는 데몬으로 특별한 하드웨어가 필요 없고 CPU 자체와 클럭만 필요하므로 가상화 환경에서도 작동합니다.
Ubuntu/Debian:
apt-get install haveged
update-rc.d haveged defaults
service haveged start
RHEL/Cent에서OS:
yum install haveged
systemctl enable haveged
systemctl start haveged
옵션 2랜덤성 요건 감소
이 어떠한 않거나 랜덤성에이 없는 , "로 할 수 ./dev/urandom
대신 차단되지 않음을 보증합니다.
하려면 , 「」, 「」파일을 합니다.jre/lib/security/java.security
에서는 Java를 합니다./dev/urandom
(다른 버그로 인해 다음과 같이 지정해야 합니다./dev/./urandom
를 참조해 주세요.
다음과 같이 합니다.
#securerandom.source=file:/dev/random
securerandom.source=file:/dev/./urandom
그러면 명령줄에서 지정할 필요가 없습니다.
주의: 암호화를 할 경우 엔트로피가 높아야 합니다.대표적인 사례 - 안드로이드 PRNG 발행으로 인해 Bitcoin 지갑의 보안이 저하되었습니다.
도 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★SecureRandom
데비안 25일설치 the the the를 했습니다.haveged
하여 "daemon"을 확인합니다./dev/random
헤드리스 서버에서는 필요한 엔트로피를 생성하기 위해 이와 같은 것이 필요합니다.의처에 내 SecureRandom
아마 밀리초가 걸릴 겁니다.
진정한 "암호학적으로 강력한" 랜덤성을 원한다면 강력한 엔트로피 소스가 필요합니다. /dev/random
는 시스템 이벤트가 엔트로피(디스크 읽기, 네트워크 패킷, 마우스 이동, 키 누르기 등)를 수집하기 위해 대기해야 하기 때문에 느립니다.
보다 빠른 해결책은 하드웨어 난수 생성기입니다.메인보드에 이미 내장되어 있을 수 있습니다.사용방법 및 사용방법에 대해서는hw_random 매뉴얼을 참조해 주십시오.rng-tools 패키지에는 하드웨어에서 생성된 엔트로피를 에 공급하는 데몬이 포함되어 있습니다./dev/random
.
HRNG를 할 수 퍼포먼스를이 있는 를 "HRNG"의 수 ./dev/random
PRNG가 대부분의 작업을 수행합니다.SP800-90에는 구현이 간단한 NIST 승인 PRNG가 몇 개 기재되어 있습니다.
매뉴얼에 따르면 SecureRandom에서 사용되는 알고리즘은 다음과 같습니다.
- *NIX (macOS)
- PKCS11(Solaris 상에서만)
- 네이티브 PRNG
- SHA1PRNG
- 네이티브 PRNGBlocking
- 네이티브 PRNGNon 블로킹
- Windows の windows windows
- DRBG
- SHA1PRNG
- Windows-PRNG
Linux에 대해 질문하셨기 때문에 Solaris에서만 실제로 이용 가능한 PKCS11은 무시하겠습니다.설치를 직접 하셨다면 아마 이 질문은 하지 않으실 겁니다.
SHA1PRNG
초기 시드는 현재 시스템 속성과 java.security 엔트로피 수집 장치의 조합을 통해 이루어집니다.
네이티브 PRNG
nextBytes()
/dev/urandom
generateSeed()
/dev/random
네이티브 PRNGBlocking
nextBytes()
★★★★★★★★★★★★★★★★★」generateSeed()
/dev/random
네이티브 PRNGNon 블로킹
nextBytes()
★★★★★★★★★★★★★★★★★」generateSeed()
/dev/urandom
, ,, 이, 이, 이, 이, 이, that, that, that, that, that, that를 사용하면SecureRandom random = new SecureRandom()
는 기능하는 것을 PRNG입니다.은, 「Native PRNG」로부터 이 되는 것을 합니다.네이티브 PRNG.그것은, 그 자체가 그 리스트로부터 시드 되고 있는 것을 의미합니다./dev/random
으로 시드를 ), 에 (시드를 생성하는 경우 사용), 를 사용합니다./dev/urandom
음음, ints, double, boilans, what-have-yous, what-have-yous.
★★/dev/random
는 퍼포먼스를 저해할 가능성이 있는 블로킹(엔트로피 풀에 엔트로피가 충분히 있을 때까지 블록)하고 있습니다.
하나의 은 충분한 엔트로피를 할 수 와 같은 것을 이고, 은 엔트로피를 충분히 할 수 있도록 해지를 사용하는 입니다./dev/urandom
에 대해 할 수 보다 은 이 인스턴스의 jvm에 대해 이를 수행하는 입니다.SecureRandom
「」를 사용해 .SecureRandom random = SecureRandom.getInstance("NativePRNGNonBlocking")
(알고리즘 없음)을 수 Native PRNGNon Blocking(네이티브 PRNGNon 블로킹).
SecureRandom random;
try {
random = SecureRandom.getInstance("NativePRNGNonBlocking");
} catch (NoSuchAlgorithmException nsae) {
random = new SecureRandom();
}
또한 다른 *nix 시스템에서는 다르게 동작할 수 있습니다.
이는?/dev/urandom
충분히 무작위인가요?
통념에 의하면/dev/random
충분히 무작위입니다.그러나 일부 목소리는 다르다."SecureRandom을 사용하는 올바른 방법" 및 "Mythes about /dev/urandom"에서는 다음과 같이 주장합니다./dev/urandom/
그만큼 좋아.
정보보안 스택 상의 사용자는 이에 동의합니다.기본적으로, 만약 당신이 물어봐야 한다면,/dev/urandom
당신의 목적에 적합하다.
8을 8을 호출하는 알 수 있었습니다.SecureRandom.getInstanceStrong()
'에게 '나에게'를 .NativePRNGBlocking
몇 초.이것은 종종 몇 바이트의 솔트를 생성하기 위해 몇 초 동안 차단됩니다.
는 노골적으로 하는 것으로 .NativePRNGNonBlocking
대신 이름에서 예상한 대로 차단되지 않습니다.나는 이것이 보안에 미치는 영향이 무엇인지 전혀 모른다.아마도 논블로킹 버전은 사용되는 엔트로피의 양을 보장할 수 없습니다.
업데이트: 네, 이 훌륭한 설명을 찾았습니다.
차단을 하려면 , 「 「 」, 「 」를 합니다.new SecureRandom()
은 .을 사용합니다./dev/urandom
않고 /dev/random
글에서 "/dev/random을 호출하고 싶은 유일한 시간은 머신이 처음 부팅되고 엔트로피가 아직 누적되지 않았을 때입니다."
SecureRandom.getInstanceStrong()
가장 강력한 RNG를 제공하지만 여러 번 차단해도 아무런 영향이 없는 상황에서만 사용할 수 있습니다.
「 」에 대해 /dev/random
것 같아요.SecureRandom
알고리즘이 사용하는 랜덤성의 원천을 사용합니다.그 둘은 직교한다.둘 중 누가 당신을 느리게 하는지 알아내야 해요.
링크된 일반 산술 페이지에 랜덤성의 근원에 대처하고 있지 않다고 명시되어 있습니다.
등 프로바이더를 하여 BouncyCastle의 할 수 .SecureRandom
더 빠릅니다.
간단한 검색을 통해 기본 구현을 Fortuna로 대체하는 Linux 패치도 확인할 수 있습니다.이 일에 대해 더 아는 것은 모르지만, 조사해 보세요.
, 잘못 실장된 것을 만,SecureRandom
또는에서는, 「JCE 」를 사용해 Provider 를 롤 할 수 .SecureRandomSpi
Sun과 계약하려면 절차를 거쳐야 하지만, 실제로는 매우 간단합니다.암호 라이브러리에 대한 미국의 수출 제한에 대해 알고 있다는 것을 팩스로 알려주시면 됩니다.
(적어도 Ubuntu에서는) 시스템에 인위적인 랜덤성을 공급하는 도구가 있습니다.명령어는 다음과 같습니다.
rngd -r /dev/urandom
앞쪽에 수도가 필요할 수도 있어요rng-tools 패키지가 없는 경우 설치해야 합니다.제가 이걸 해봤는데 확실히 도움이 됐어요!
저도 같은 문제에 직면했어요.검색어에 맞는 검색어를 검색한 후, Digital Ocean에 관한 멋진 기사를 우연히 발견했습니다.
haveged는 보안에 영향을 주지 않는 잠재적인 솔루션입니다.
나는 단지 여기 기사에서 관련 부분을 인용하고 있을 뿐이다.
HAVEGE의 원리와 그 이전의 관련 라이브러리에 근거해, 헤지에서는 프로세서의 코드 실행 시간의 변화에 근거해 랜덤성을 생성할 수 있습니다.같은 하드웨어상의 같은 환경에서도, 1개의 코드의 실행에 같은 시간이 걸리는 것은 거의 불가능하기 때문에, 1개 또는 복수의 프로그램을 실행하는 타이밍은 랜덤 소스의 시드에는 적합할 것입니다.헤지 실장은 루프를 반복 실행한 후 프로세서의 타임스탬프 카운터(TSC)의 차이를 사용하여 시스템의 랜덤 소스(통상은 /dev/random)를 시드합니다.
해시 설치 방법
이 문서의 단계를 따르십시오.https://www.digitalocean.com/community/tutorials/how-to-setup-additional-entropy-for-cloud-servers-using-haveged
여기에 올렸습니다.
저는 이 문제에 직접 부딪힌 적은 없지만, 프로그램 시작 시 즉시 시드 생성을 시도했다가 죽는 스레드를 만들 것입니다.randoms를 호출하는 메서드는 스레드가 활성화되어 있는 경우 해당 스레드에 결합되므로 첫 번째 콜은 프로그램 실행 초기에 발생한 경우에만 차단됩니다.
제 경험은 PRNG의 느린 초기화뿐이며, 그 후 랜덤 데이터 생성은 없었습니다.보다 적극적인 초기화 전략을 시도합니다.작성 비용이 많이 들기 때문에 싱글톤처럼 취급하여 동일한 인스턴스를 재사용합니다.한 인스턴스에 대해 스레드 경합이 너무 많은 경우 해당 인스턴스를 풀링하거나 스레드 로컬로 만듭니다.
난수 생성에 타협하지 마세요.거기에 약점이 있으면 보안이 모두 무너져
COTS 원자붕괴 기반 발전기는 별로 없지만 랜덤 데이터가 많이 필요하다면 몇 가지 계획이 있습니다.HotBits를 포함하여 항상 볼만한 흥미로운 것이 있는 사이트 중 하나는 John Walker의 Fourmilab이다.
RNG 요건에 대해 좀 더 명확히 해야 할 것 같네요.가장 강력한 암호화 RNG 요건은 (제가 이해하기로는) 생성에 사용된 알고리즘을 알고 있고 이전에 생성된 난수를 모두 알고 있다고 해도 미래에 생성되는 난수에 대한 유용한 정보를 얻을 수 없다는 것입니다.실용적이지 않은 처리 능력을 소비하지 않고서는 말이죠.
이렇게 랜덤성을 완전히 보장할 필요가 없다면 적절한 성능 트레이드오프가 있을 수 있습니다.Uncommons-Maths 또는 Fortuna의 AESCounterRNG에 대한 Dan Dyer의 답변에 동의하는 경향이 있습니다(그 저자 중 한 명은 암호학 전문가 Bruce Schneier입니다).저도 써본 적은 없지만 언뜻 보기에는 평판이 좋은 것 같아요.
첫 번째 랜덤시드를 정기적으로 생성할 수 있다면(예를 들어 하루에 한 번, 시간 또는 기타 등), 스트림의 연속적인 청크에서 랜덤한 번호를 생성하기 위해 고속 스트림 암호를 사용할 수 있습니다(스트림 암호에서 XOR을 사용하는 경우에는 늘 스트림을 통과하거나 XOR 비트를 직접 캡처합니다).ECRYPT의 eStream 프로젝트에는 퍼포먼스 벤치마크 등 많은 정보가 포함되어 있습니다.이렇게 하면 보충한 시점 사이에 엔트로피가 유지되지 않습니다.따라서 누군가가 난수 중 하나와 사용한 알고리즘을 알고 있다면 기술적으로 스트림 암호를 해독하고 미래의 난수를 예측할 수 있는 내부 상태를 추측할 수 있을 것입니다.하지만 그 위험과 그 결과가 엔트로피를 유지하는 데 드는 비용을 정당화하기에 충분한지 결정해야 합니다.
편집: 이 토픽과 매우 관련이 있는 것으로 보이는 RNG에 관한 암호화 과정 노트입니다.
시큐어 랜덤을 반복 알고리즘의 초기화 소스로 사용합니다.그 후 대량 작업에 Mersenne 트위스터를 사용할 수 있습니다.이 트위스터는 한동안 사용되었으며 다른 prng보다 우수하다는 것이 증명되었습니다.
http://en.wikipedia.org/wiki/Mersenne_twister
초기화에 사용되는 시큐어 랜덤을 항상 갱신해 주세요.예를 들어 클라이언트당1개의 mersen twister 의사 랜덤 생성기를 사용하여 충분한 수준의 랜덤화를 얻을 수 있습니다.
하드웨어가 지원하는 경우 제가 작성자인 Java RdRand Utility를 사용해 보십시오.
★★★★★★★★★★★★★★★★★★★★에 근거하고 있습니다.RDRAND
입니다.SecureRandom
이치노
CPU가 「」( 「」, 「」)하는 ).rdrand
을 이용하다 때 '예시하다'를 해야 요.RdRandRandom()
.Provider
을 사용하다
또 하나 살펴봐야 할 것은 부동산 보안이다.파일 lib/security/security.security의 소스
/dev/random 대신 /dev/urandom을 사용하면 성능상의 이점이 있을 수 있습니다.랜덤 번호의 품질이 중요한 경우 보안을 침해하는 타협을 하지 마십시오.
언급URL : https://stackoverflow.com/questions/137212/how-to-deal-with-a-slow-securerandom-generator
'itsource' 카테고리의 다른 글
Larabel Altural을 사용하여 마지막으로 삽입된 ID 가져오기 (0) | 2022.11.24 |
---|---|
Android의 AsyncTask에서 값 반환 (0) | 2022.11.24 |
인터페이스에는 스태틱메서드가 없지만 스태틱필드와 내부 클래스는 정상인 이유는 무엇입니까?[Java8 이전] (0) | 2022.11.24 |
ISO 8601 datetime 문자열을 Python datetime 개체로 변환하려면 어떻게 해야 합니까? (0) | 2022.11.24 |
Symfony 2에서 모든 요청 매개 변수 가져오기 (0) | 2022.11.24 |