보안성이 강화된 랜덤 값이 필요할때 아래와 같은 코드를 사용할 수 있다.

import java.security.SecureRandom;

public class Test {
	public static void main(String[] args) throws Exception {
		SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
		System.out.println(random.generateSeed(16));
	}
}

컴파일 하고 실행해보면 일부 시스템(주로 오래된 리눅스 시스템)에서는 6번 라인에서 멈춰있는걸 볼 수 있는데 이유는 SecureRandom 클래스가 사용하는 OS의 난수 생성기가 응답을 주지 않기 때문이다.

문제가 되는 리눅스 시스템의 경우 기본적으로 /dev/random 디바이스를 사용한다. 이 디바이스는 높은 보안성을 제공하기 위해 시스템의 노이즈(키보드, 마우스, 디스크 등에서 발생하는 IO)를 사용해 시드를 생성하기 때문에 이런 노이즈가 충분하지 않은 상황에서는 이 장치에 대한 read 요청이 블락되기 때문에 프로세스가 멈춘 것 처럼 보일 수 있다.

이에 대한 해결책은 /dev/random 대신 /dev/urandom 디바이스를 사용하는 것인데, 이 장치는 시스템의 노이즈가 충분하지 않은 상황에서도 빠른 시간 내에 응답을 준다. (하지만 즉시 결과를 얻을 수 있다고 100% 보장하지는 않는다)

위의 Java 프로그램을 원활하게 실행하기 위해선 vm 옵션을 주어 아래처럼 실행하면 된다.

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