JEP-123 で利用時に指定する方法が提案されてJava8で使えるようになったらしい。Linuxだと標準で /dev/random
を使うからエントロピーが全部消費されてる状態だとブロックされてた。
- http://openjdk.java.net/jeps/123
- https://bugs.openjdk.java.net/browse/JDK-8046113
- http://docs.oracle.com/javase/jp/8/technotes/guides/security/StandardNames.html#SecureRandom
- http://docs.oracle.com/javase/jp/7/technotes/guides/security/StandardNames.html#SecureRandom
- http://docs.oracle.com/javase/jp/8/api/java/security/SecureRandom.html#getInstance-java.lang.String-java.lang.String-
- http://docs.oracle.com/javase/jp/8/api/java/security/Security.html#getProvider-java.lang.String-
- http://blog.64p.org/entry/2014/10/08/233604
SecureRandom
を作るときに NativePRNGNonBlocking
を使う
SecureRandom.getInstance("NativePRNGNonBlocking")
Java8から強い乱数生成器を使うには SecureRandom.getInstanceStrong()
が推奨されてるっぽい。
System.out.println(new SecureRandom().getAlgorithm());
System.out.println(SecureRandom.getInstanceStrong().getAlgorithm());
NativePRNG
NativePRNGBlocking
http://stackoverflow.com/questions/137212/how-to-solve-performance-problem-with-java-securerandom
a. java.security.egd
に urandom を指定する
java -Djava.security.egd=file:/dev/./urandom
b. SecureRandom
を作るときに SHA1PRNG
を使う (Windows の場合と同じ動作)
SecureRandom.getInstance("SHA1PRNG")
というか、1.7.0_71 で java.security
に urandom 指定されてるし random 指定すると SHA1PRNG
が使われるんですが??
いろいろ勘違いしてた。
- Java7の場合
securerandom.source
のデフォルト値は/dev/urandom
になっているsecurerandom.source
に/dev/urandom
が指定されているとデフォルトのアルゴリズムとしてNativePRNG
が使われる- 乱数生成器は
/dev/urandom
が使われる
- 乱数生成器は
securerandom.source
に/dev/random
が指定されているとデフォルトのアルゴリズムとしてSHA1PRNG
が使われる- 乱数生成器はJavaで作られたものを使う
- この時乱数の種を
java.security.egd
で指定されたデバイスから取得する- 乱数の種はおそらくJavaの起動時に一度だけ取得される (もしくは
SecureRandom
を作った時) java.security.egd
のデフォルトは/dev/random
になっているから、何度も実行するとブロックすることがあるjava.security.egd
に/dev/urandom
を指定すると種も擬似乱数になるからブロックしない
- 乱数の種はおそらくJavaの起動時に一度だけ取得される (もしくは
- Java8
securerandom.source
のデフォルト値は/dev/random
になっているsecurerandom.source
が/dev/random
でも/dev/urandom
でもデフォルトのアルゴリズムとしてNativePRNG
が使われる- 乱数生成器は
/dev/random
な気がするけど自身ない
- 乱数生成器は
getInstanceStrong
を指定した場合はNativePRNGBlocking
がアルゴリズムとして使われる- 乱数生成器は
/dev/random
が使われる
- 乱数生成器は
ソース見て確認しよう。
ざっくりソースを追った。とりあえず、SHA1PRNG が種に /dev/random を使って NativePRNG は /dev/urandom なのは正しい。
手元のメモには書いたけど後でまとめよう。