2017-02-25 1 views
0

Java 프로그램에서 의사 랜덤 생성기 (PRNG)를 초기화하는 데 좋은 시드가 필요하고 하드웨어 임의 생성기에 액세스 할 필요가 없다고 가정 해 봅니다.JVM에서 엔트로피를 얻는 방법?

사용자 상호 작용없이 JVM에서 엔트로피를 얻는 방법은 무엇입니까?

+5

SecureRandom을 직접 사용하는 것은 어떻습니까? –

+0

SecureRandom을 사용하는 것이 좋습니다. 일부 모드는 엔트로피를 사용하여 시드를 생성합니다. –

+0

맞춤 PRNG를 작성하고 싶습니다. SecureRandom은 그렇게 안전하지 않습니다. Windows (Java 8)에서는 기본적으로 SHA1PRNG를 사용합니다. SHA-1은 http://www.pcworld.com/article/3173791/security/stop-using-sha1-it-s-now-completely-unsafe.html에서 감가 상각됩니다. –

답변

3

SHA-1은

취약점은 CSPRNG 건설 관련이 없습니다 감가 상각 할 예정이다.

엔트로피를 JVM에서 가져 오는 방법은 무엇입니까?

SecureRandom

2

including OS-specific entropy sources 당신은 정적으로도 SecureRandom 자체에 사용되는 종자 입력을 검색 할 generateSeed(int) 또는 getSeed(int)를 사용하여 다양한 보안 업체를 통해 일반적인 외관이다. 그런 다음 씨앗을 사용하여 자신의 CSPRNG를 시드 할 수 있습니다.

the8472가 이미 설명 했으므로 실제로 그렇게 할 필요가 거의 없지만 자신의 CSPRNG (or DRBG as it is known to NIST)를 생성하려는 경우 아무 것도 멈추지 않습니다. SecureRandom 구현의 생성자에 시드를 제공하면됩니다.

더 나은 엔트로피를 생성 할 수있는 기회는 최소한입니다. 표준 System.nanoTime()setSeed이라는 이름을 사용하여 CSPRNG의 내부 상태에 추가하는을 사용할 수 있습니다. 그래도 그렇게하기 전에 nextXxx 메서드 중 하나를 호출 할 것입니다. 그렇지 않으면 대신 엔트로피를 추가하는 대신 바꿉니다.


SecureRandom을 확장 할 수 있습니다. 대부분의 다른 암호화 관련 클래스에서는 그렇지 않습니다. CSPRNG를 구현하는 것은 마음이 약한 것이 아닙니다. SHA1PRNG가 최소 일 때 더 나은 CSPRNG를 생성 할 수있는 기회 (아파치 구현은 단 한 번의 시도만으로도 매우 끔찍한 속성을가집니다).

관련 문제