답변:
Java 응용 프로그램은 java.security.SecureRandom 클래스를 사용하여 CSPRNG (암호 적으로 강력한 의사 난수 생성기 ) 를 사용하여 암호로 강력한 임의 값을 생성 할 수 있습니다 . java.util.Random 클래스 의 표준 JDK 구현은 암호화 적으로 강력한 것으로 간주되지 않습니다.
유닉스 계열 운영 체제에는 /dev/random
장치 드라이버 및 기타 소스에서 수집 된 환경 노이즈에 액세스하는 의사 난수를 제공하는 특수 파일 인가 있습니다. 그러나 요청 된 것보다 적은 엔트로피가 있으면 차단합니다 . /dev/urandom
의사 난수 생성기 시드가 부팅 이후 엔트로피로 완전히 초기화되지 않은 경우에도 일반적으로 차단되지 않습니다. /dev/arandom
시드가 충분한 엔트로피로 안전하게 초기화 될 때까지 부팅 후 블로킹 한 다음 다시 차단하지 않는 세 번째 특수 파일이 여전히 있습니다 .
기본적으로 JVM은을 사용하여 SecureRandom 클래스를 시드 /dev/random
하므로 Java 코드가 예기치 않게 차단 될 수 있습니다 . -Djava.security.egd=file:/dev/./urandom
Java 프로세스를 시작하는 데 사용되는 명령 행 호출 옵션 은 JVM이 /dev/urandom
대신 사용하도록 지시합니다 .
추가로 /./
JVM 은 SHA-1을 PRNG (Pseudo Random Number Generator)의 기초 로 사용하는 SHA1PRNG 알고리즘 을 사용하는 것으로 보입니다 . /dev/urandom
지정된 경우 사용되는 NativePRNG 알고리즘보다 강력 합니다.
마지막으로, /dev/urandom
의사 난수 생성기 인 PRNG/dev/random
라는 신화가 있으며 , "진정한"난수 생성기 입니다. 이것은 단순히 사실이 아니다, 모두 /dev/random
와 /dev/urandom
같은 CSPRNG (암호 보안 의사 랜덤 넘버 생성기)에 의해 공급된다. 일부 추정에 따르면 각각의 풀에 엔트로피가 부족할 때의 동작 만 다릅니다. /dev/random
블록 /dev/urandom
은 그렇지 않습니다.
엔트로피가 부족하면 어떻습니까? 중요하지 않습니다.
“임의로 보이는 것”은 많은 암호화 구성 요소의 기본 요구 사항입니다. 그리고 암호화 해시의 출력을 얻는다면 암호가 그것을 받아 들일 수 있도록 임의의 문자열과 구별 할 수 없어야합니다. SHA1PRNG 알고리즘을 사용하는 이유는 시드와 함께 해시 함수와 카운터를 사용하기 때문입니다.
언제 적용 되나요?
항상 말할 것입니다.
출처 :
https://gist.github.com/svrc/5a8accc57219b9548fe1
https://www.2uo.de/myths-about-urandom
04/2020 편집 :
주석에는 Java 8의 SecureRandom 클래스 동작에 대한 변경 내용이 언급되어 있습니다 .
SHA1PRNG 및 NativePRNG는 java.security 파일의 SecureRandom 시드 소스 특성을 올바르게 준수하도록 수정되었습니다. file : /// dev / urandom 및 file : / dev /./ urandom을 사용하는 모호한 해결 방법은 더 이상 필요하지 않습니다.
이것은 이미 위의 소스 섹션에서 참조 된 테스트에 의해 지적되었습니다. Java 8의 SecureRanom 에서 /./
사용하는 알고리즘 을 NativePRNG에서 SHA1PRNG로 변경하려면 추가 기능 이 필요합니다 .
그러나 공유하고 싶은 소식이 있습니다. 당으로 JEP-273 자바 (9) 이후, 의 SecureRandom 클래스가 구현하는 세 가지 결정적 랜덤 비트 생성기 (DRBG) 메커니즘에 설명 NIST 800-90Ar1 . 이러한 메커니즘은 SHA-512 및 AES-256만큼 강력한 최신 알고리즘을 구현합니다.
JDK에는 두 가지 종류의 SecureRandom 구현이 있습니다.
/dev/{u}random
Unix 에서 읽 거나 Windows에서 CryptoAPI를 사용하는 것과 같은 기본 호출 또는 OS 장치를 기반 으로합니다. 최신 Linux 및 Windows 릴리스는 이미 DRBG를 지원 하지만 이전 릴리스 및 임베디드 시스템은 지원하지 않을 수 있습니다 .한편 Java 13 보안 개발자 안내서는 여전히 읽습니다.
Linux 및 macOS에서 java.security의 엔트로피 수집 장치가
file:/dev/urandom
또는 로 설정된file:/dev/random
경우 NativePRNG가 SHA1PRNG보다 선호됩니다. 그렇지 않으면 SHA1PRNG가 선호됩니다.
새로운 DRBG 메커니즘이 이전 PRNG와 함께 작동하는 방식을 명확히하기 위해 AdoptOpenJDK (빌드 13.0.2 + 8)를 사용하여 macOS (Darwin)에서 일부 테스트를 실행합니다. 결과는 다음과 같습니다.
파일 : / dev / random
제공자 우선 순위 :
SecureRandom.NativePRNG
SecureRandom.DRBG
SecureRandom.SHA1PRNG
파일 : / dev / urandom
제공자 우선 순위 :
SecureRandom.NativePRNG
SecureRandom.DRBG
SecureRandom.SHA1PRNG
파일 : / dev /./ urandom
제공자 우선 순위 :
SecureRandom.DRBG
SecureRandom.SHA1PRNG
SecureRandom.NativePRNG
결론:
코드를 예기치 않게 차단하지 않으면 서 사용하는 플랫폼에 관계없이 사용 가능한 -Djava.security.egd=file:/dev/./urandom
가장 강력한 SecureRandom 구현 을 활용하기 위해 사용 하는 것이 좋습니다 .
/dev/urandom
하는 /dev/urandom
동안 공급되는 NativePRNG 를 선택하고 Java 9부터는 소스가 지정 될 때 DRBG가 우선 합니다. /dev/./urandom
/dev/urandom
/dev/./urandom
JDK 8 이상을 사용하는 경우 더 이상 필요하지 않습니다.
이 문제는 Java에 의해 수정되었으며 여기에 몇 가지 링크가 있습니다.
개요
SHA1PRNG 및 NativePRNG는 java.security 파일의 SecureRandom 시드 소스 특성을 올바르게 준수하도록 수정되었습니다. file : /// dev / urandom 및 file : / dev /./ urandom을 사용하는 모호한 해결 방법은 더 이상 필요하지 않습니다.
자세한 정보 (페이지에서 무작위 검색) :
https://docs.oracle.com/javase/8/docs/technotes/guides/security/enhancements-8.html
https://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html
이것은 리눅스 /dev/random
와 /dev/urandom
난수 생성기 의 차이점과 관련이 있습니다.
이 링크 에서 가져온
Java 버그 6202721에 따르면 (2004 년경) / dev / urandom이 제대로 작동하지 않아서 / dev / urandom이 지정된 경우에도 java.security.SecureRandom은 / dev / urandom 대신 / dev / random을 사용합니다. / dev / urandom이 아주 잘 작동한다는 버그는 이제 되돌려지지 않았습니다. 따라서 / dev / random 대신 SHA1PRNG를 강제로 사용하려면 /dev/./urandom을 사용하여 설정을 숨겨서 위조해야합니다.
질문에 대답하기 위해
언제 적용 되나요?
위의 링크를 기반으로, 이는 2004 년 Linux 시스템에서 / dev / urandom의 문제로 인해 Java 버전 5 및 그 이후의 고유 한 링크입니다.