Sia OpenJDK che Sun leggono da /dev/urandom
, non /dev/random
, almeno sulla macchina su cui ho testato (OpenJDK JRE 6b27 e Sun JRE 6.26 su Debian squeeze amd64). Per qualche motivo, entrambi aprono /dev/random
pure ma mai letto da esso. Quindi gli articoli del blog che hai letto sono stati sbagliati o applicati a una versione diversa dalla mia (e, a quanto pare, dalla tua).
Puoi controllare se il tuo legge da /dev/random
o /dev/urandom
tracciandolo:
strace -o a.strace -f -e file java A
e cerca la parte rilevante della traccia:
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
…
Non preoccuparti, /dev/urandom
va benissimo per la crittografia.
SecureRandom di Java fa usa /dev/random, ma solo brevemente.
Nello specifico lo usa solo quando genera informazioni di inizializzazione, chiamando esplicitamente SecureRandom.generateSeed()
o dalla prima chiamata a nextInt()
Quindi, per ripetere il tuo esempio bash puoi fare quanto segue, e dovrebbe bloccarsi.
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);
}
}
Non solo per mantenere in vita un vecchio thread, ma alcune persone potrebbero essersi perse una parte importante della lunga storia che c'è dietro... Si trattava di un bug ben noto e persistente quando si utilizzava /dev/urandom dalle versioni Java 1.4 alle versioni 1.7. Vedi i link qui sotto :
http://bugs.java.com/view_bug.do?bug_id=6202721
http://bugs.java.com/view_bug.do?bug_id=4705093
Per quanto ne so, questo è stato finalmente risolto in Java 8 come affermato da Oracle:https://docs.oracle.com/javase/8/docs/technotes/guides/security/enhancements-8.html
SHA1PRNG e NativePRNG sono stati corretti per rispettare correttamente le proprietà dell'origine seed SecureRandom nel file java.security. (L'oscura soluzione usando file:///dev/urandom e file:/dev/./urandomi non è più richiesta.)