Sowohl OpenJDK als auch Sun lesen von /dev/urandom
, nicht /dev/random
, zumindest auf der Maschine, auf der ich getestet habe (OpenJDK JRE 6b27 und Sun JRE 6.26 auf Debian Squeeze AMD64). Aus irgendeinem Grund öffnen beide /dev/random
auch, aber nie daraus gelesen. Die Blog-Artikel, die Sie gelesen haben, waren also entweder falsch oder beziehen sich auf eine andere Version als meine (und anscheinend auch Ihre).
Sie können überprüfen, ob Ihr Text ab /dev/random
lautet oder /dev/urandom
durch Verfolgen:
strace -o a.strace -f -e file java A
und suchen Sie nach dem relevanten Teil der Ablaufverfolgung:
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
…
Keine Sorge, /dev/urandom
ist vollkommen in Ordnung für Kryptografie.
Javas SecureRandom macht es Verwenden Sie /dev/random, aber nur kurz.
Insbesondere wird es nur beim Generieren von Seed-Informationen verwendet, entweder durch explizites Aufrufen von SecureRandom.generateSeed()
oder durch den ersten Aufruf von nextInt()
Um Ihr Bash-Beispiel zu wiederholen, können Sie also Folgendes tun, und es sollte blockieren.
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);
}
}
Nicht nur, um einen alten Thread am Leben zu erhalten, sondern einige Leute haben vielleicht einen wichtigen Teil der langen Geschichte dahinter verpasst ... Es ging um einen bekannten, berüchtigten und hartnäckigen Fehler bei der Verwendung von /dev/urandom von Java Version 1.4 bis Version 1.7. Siehe die Links unten :
http://bugs.java.com/view_bug.do?bug_id=6202721
http://bugs.java.com/view_bug.do?bug_id=4705093
Soweit ich weiß, wurde dies endlich in Java 8 behoben, wie von Oracle angegeben:https://docs.oracle.com/javase/8/docs/technotes/guides/security/enhancements-8.html
SHA1PRNG und NativePRNG wurden korrigiert, um die Eigenschaften der SecureRandom-Seed-Quelle in der Datei java.security korrekt zu respektieren. (Der obskure Workaround mit file:///dev/urandom und file:/dev/./urandom ist nicht mehr erforderlich.)