java.security.egd 옵션은 무엇입니까?


22

내가 작업중 인 프로젝트에서 응용 프로그램은 다음과 비슷한 명령을 사용하여 시작됩니다.

java -Djava.security.egd=file:/dev/urandom -jar app.jar

나는 java.security.egd전에 옵션을 본 적이 없다 . 비트를 검색하면 Java 응용 프로그램에서 난수 생성을 구성하는 데 사용됩니다.

맞아? 언제 적용 되나요?

답변:


29

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/./urandomJava 프로세스를 시작하는 데 사용되는 명령 행 호출 옵션 은 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}randomUnix 에서 읽 거나 Windows에서 CryptoAPI를 사용하는 것과 같은 기본 호출 또는 OS 장치를 기반 으로합니다. 최신 Linux 및 Windows 릴리스는 이미 DRBG를 지원 하지만 이전 릴리스 및 임베디드 시스템은 지원하지 않을 수 있습니다 .
  • 다른 종류는 이전의 SHA1 기반 RNG 구현을 사용하는 순수한 Java 구현으로, 승인 된 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 구현 을 활용하기 위해 사용 하는 것이 좋습니다 .


1
Java 8부터는 파일 이름에서 extra ./의 "모호한 해결 방법"이 더 이상 필요하지 않으므로 "/ dev / urandom"만 사용할 수 있습니다 ( docs.oracle.com/javase/8/docs
Kamal

답변을 업데이트 해 주셔서 감사합니다 (특히 Java 9 및 13의 변경 사항에 대해). Java 8에서 "엔트로피 수집 장치"를 / dev / urandom 또는 /dev/./urandom으로 설정하면 정확히 동일한 결과를 얻을 수 있습니다. 그렇지 않으면 수정이 의미가 없습니다. OS 관점에서 보면 동일한 파일을 가리 키므로 Java에는 영향을 미치지 않아야합니다 (수정 전에 수행되었지만 의도 된 기능이 아닌 버그였습니다). 따라서 "PRNG 선택에 영향을 미치려면 추가 /./가 필요합니다." Java 8 기준으로 더 이상 사실이 아니어야합니다.
Kamal

의견을 보내 주셔서 감사합니다. 이전 문구 "PRNG selection"이 명확하지 않았습니다. NativePRNG 또는 SHA1PRNG : 사용 된 알고리즘에 대해 이야기하고 있음을 분명히하기 위해 그것을 다시 정의했습니다. Java 8을 사용할 때 SHA1PRNG 를 선택 /dev/urandom하는 /dev/urandom동안 공급되는 NativePRNG 를 선택하고 Java 9부터는 소스가 지정 될 때 DRBG가 우선 합니다. /dev/./urandom/dev/urandom/dev/./urandom
dbaltor

1

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


나는 이것이 옳지 않다고 생각합니다. 배경 : tersesystems.com/blog/2015/12/17/… Java 8의 수정 사항은 이제 java.security 파일의 SecureRandom 시드 소스 특성을 존중한다고 말합니다. 그러나 기본적으로 여전히 다음을 포함합니다. securerandom.source = file : / dev / random "모호한 해결 방법"은 파일 이름에서 여분의 ./를 참조하며 여기에 허용 된 (그리고 가장 많이 투표 된) 대답으로 언급됩니다.
Kamal

"모호한 해결 방법" 특정 상황에서만 필요했습니다. bugs.java.com/bugdatabase/view_bug.do?bug_id=6202721
Kamal

@Kamal 게시 한 링크는 Java 6 및 이전 버전을 의미합니다.
Venu Madhav

버그 요점에 따르면, Java 1.4.2부터 최대 6까지 "불명확 한 해결 방법"(파일 이름에 여분의 ./ 추가)이 필요했습니다. Java 7에서도 그렇지 않으면 Java 8에서는 고정 된 것으로 언급되지 않습니다. 비 차단 장치를 사용하려면 / dev / random 대신 / dev / urandom을 설정해야합니다.
Kamal

0

이것은 리눅스 /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 및 그 이후의 고유 한 링크입니다.


Java 버그 6202721에 실제로 "/ dev / random이 제대로 작동하지 않아서 / dev / urandom을 선택한 경우 문제가됩니다"라는 내용의 오타가있을 수 있습니다. 따라서 "/ dev / urandom 문제로 인한"결론은 올바르지 않습니다. 기본값 (/ dev / random) 대신 / dev / urandom을 선택하는 방법에 대한 설명은 허용 된 답변을 참조하십시오. 대부분의 경우 좋은 생각입니다.
Kamal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.