OpenJDK と Sun の両方が /dev/urandom
から読み取ります 、 /dev/random
ではありません 、少なくとも私がテストしたマシン (Debian スクイーズ amd64 上の OpenJDK JRE 6b27 および Sun JRE 6.26) では。何らかの理由で、両方とも /dev/random
を開きます 同様に、しかしそれから読んではいけません。つまり、あなたが読んだブログ記事は間違っているか、私のバージョンとは異なるバージョンに適用されたものです (そして、どうやらあなたのバージョンも)。
あなたが /dev/random
から読み取るかどうかを確認できます または /dev/urandom
それをたどることによって:
strace -o a.strace -f -e file java A
トレースの関連部分を探します:
21165 open("/dev/random", O_RDONLY) = 6
…
21165 open("/dev/urandom", O_RDONLY) = 7
…
21165 read(7, "\322\223\211\262Zs\300\345\3264l\254\354[\6wS\[email protected]", 20) = 20
…
心配しないで、/dev/urandom
暗号化にはまったく問題ありません。
Java の SecureRandom はできる /dev/random を使用しますが、短時間だけ使用してください。
具体的には、明示的に SecureRandom.generateSeed()
を呼び出して、シード情報を生成するときにのみ使用します または nextInt()
への最初の呼び出しによって
したがって、bash の例を繰り返すには、次のようにするとブロックされます。
import java.security.SecureRandom;
public class A {
public static void main(String[] args) {
SecureRandom sr;
int out = 0;
for (int i = 0; i < 1<<20 ; i++) {
sr = new SecureRandom();
out ^= sr.nextInt();
}
System.out.println(out);
}
}
古いスレッドを存続させるだけでなく、一部の人々はこの背後にある長い物語の重要な部分を見逃している可能性があります...これは、Java バージョン 1.4 からバージョン 1.7 への /dev/urandom を使用する際の、よく知られた悪名高い永続的なバグに関するものです。以下のリンクを参照してください:
http://bugs.java.com/view_bug.do?bug_id=6202721
http://bugs.java.com/view_bug.do?bug_id=4705093
私が知っていることについては、Oracle が述べているように、これは最終的に Java 8 で対処されています:https://docs.oracle.com/javase/8/docs/technotes/guides/security/enhancements-8.html
<ブロック引用>SHA1PRNG と NativePRNG が修正され、java.security ファイルの SecureRandom シード ソース プロパティが適切に尊重されるようになりました。 (file:///dev/urandom と file:/dev/./urandom を使用したあいまいな回避策は不要になりました。)