나는 당신의 오픈 JDK 구체적인 버전을 확인할 수없는,하지만 난 jdk6-b33을 확인할 수 있습니다. 경우
SecureRandom
, 시스템 속성에서 소스
java.security.egd
첫째을 얻을 수
SunEntries
String egdSource = SunEntries.getSeedSource();
SunEntries
시도에서 SeedGenerator가 seedSource
(String)를 얻을 수
public byte[] engineGenerateSeed(int numBytes) {
byte[] b = new byte[numBytes];
SeedGenerator.generateSeed(b);
return b;
}
씨앗 바이트를 얻을 수 SeedGenerator를 사용 속성이없는 경우 속성 파일 을 java.security
속성 파일에서 가져 오려고합니다. 찾을 수 없습니다 빈 문자열을 반환합니다.소스
final static String URL_DEV_RANDOM = "file:/dev/random";
또는
final static String URL_DEV_URANDOM = "file:/dev/urandom"
가 NativeSeedGenerator
사용하는 경우
// name of the *System* property, takes precedence over PROP_RNDSOURCE
private final static String PROP_EGD = "java.security.egd";
// name of the *Security* property
private final static String PROP_RNDSOURCE = "securerandom.source";
final static String URL_DEV_RANDOM = "file:/dev/random";
final static String URL_DEV_URANDOM = "file:/dev/urandom";
private static final String seedSource;
static {
seedSource = AccessController.doPrivileged(
new PrivilegedAction<String>() {
public String run() {
String egdSource = System.getProperty(PROP_EGD, "");
if (egdSource.length() != 0) {
return egdSource;
}
egdSource = Security.getProperty(PROP_RNDSOURCE);
if (egdSource == null) {
return "";
}
return egdSource;
}
});
}
SeedGenerator
확인이 값은 윈도우에
// Static instance is created at link time
private static SeedGenerator instance;
private static final Debug debug = Debug.getInstance("provider");
final static String URL_DEV_RANDOM = SunEntries.URL_DEV_RANDOM;
final static String URL_DEV_URANDOM = SunEntries.URL_DEV_URANDOM;
// Static initializer to hook in selected or best performing generator
static {
String egdSource = SunEntries.getSeedSource();
// Try the URL specifying the source
// e.g. file:/dev/random
//
// The URL file:/dev/random or file:/dev/urandom is used to indicate
// the SeedGenerator using OS support, if available.
// On Windows, the causes MS CryptoAPI to be used.
// On Solaris and Linux, this is the identical to using
// URLSeedGenerator to read from /dev/random
if (egdSource.equals(URL_DEV_RANDOM) || egdSource.equals(URL_DEV_URANDOM)) {
try {
instance = new NativeSeedGenerator();
if (debug != null) {
debug.println("Using operating system seed generator");
}
} catch (IOException e) {
if (debug != null) {
debug.println("Failed to use operating system seed "
+ "generator: " + e.toString());
}
}
} else if (egdSource.length() != 0) {
try {
instance = new URLSeedGenerator(egdSource);
if (debug != null) {
debug.println("Using URL seed generator reading from "
+ egdSource);
}
} catch (IOException e) {
if (debug != null)
debug.println("Failed to create seed generator with "
+ egdSource + ": " + e.toString());
}
}
// Fall back to ThreadedSeedGenerator
if (instance == null) {
if (debug != null) {
debug.println("Using default threaded seed generator");
}
instance = new ThreadedSeedGenerator();
}
}
을 인스턴스를 초기화 당신이 할 때까지의 기본 그래서
URLSeedGenerator() throws IOException {
this(SeedGenerator.URL_DEV_RANDOM);
}
에 의해 /dev/random
을로드하는 슈퍼 클래스 생성자에 클래스가 단순히 SeedGenerator.URLSeedGenerator
package sun.security.provider;
import java.io.IOException;
/**
* Native seed generator for Unix systems. Inherit everything from
* URLSeedGenerator.
*
*/
class NativeSeedGenerator extends SeedGenerator.URLSeedGenerator {
NativeSeedGenerator() throws IOException {
super();
}
}
를 확장 리눅스에 기본 CryptoAPI
를 사용하여 호출하려고, 오픈 JDK는 기본적으로 /dev/random
를 사용 시스템 속성 java.security.egd
또는 보안 등록 정보 파일의 등록 정보 securerandom.source
에 다른 값을 설정하지 마십시오.
당신이이 같은 것을 볼 수 있습니다
sudo strace -o a.strace -f -e trace=open,read java class
trace=open,read
표현 당신이 명령 줄을 변경할 수 있습니다 strace
를 사용하여 읽기 결과를보고 추가 할 경우 (내가 그랬어 오라클 JDK 6 테스트)
13225 open("/dev/random", O_RDONLY) = 8
13225 read(8, "@", 1) = 1
13225 read(3, "PK\3\4\n\0\0\0\0\0RyzB\36\320\267\325u\4\0\0u\4\0\0 \0\0\0", 30) = 30
....
....
빠른 시작을위한
톰캣 위키 섹션이 시작하는 동안 지연이 발생하는 경우는/dev/urandom을 같은 비 차단 엔트로피 소스를 사용하는 것이 좋습니다
자세한 정보 : https://wiki.apache.org/tomcat/HowTo/FasterStartUp#Entropy_Source
희망이 있습니다.
'new SecureRandom'을 사용하여 새로운 랜덤 gen을 생성 한 작은 응용 프로그램을 시도해 볼 수 있습니다. 그리고 나서'urandom'에서 읽었는지 확인하십시오. 그래도 동일한 자바 런타임을 대상으로하고 Tomcat에'java -D'를 사용하여 java.security.egd 속성이 설정되어 있지 않은지 확인하십시오. –
샘플 프로그램 (링크의 질문에서 가져온 코드)을 실행했습니다. 질문에 첨부 된 strace 로그에 표시된대로/dev/random이나/dev/urandom에서 읽지 않습니다. –
''jre/lib/security/java.security'를 확인하고'securerandom.source'가 어떻게 정의되어 있는지 확인할 수 있습니까? –