Tanto OpenJDK como Sun leen desde /dev/urandom
, no /dev/random
, al menos en la máquina donde probé (OpenJDK JRE 6b27 y Sun JRE 6.26 en Debian squeeze amd64). Por alguna razón, ambos abren /dev/random
también, pero nunca lo leí. Entonces, los artículos del blog que leíste estaban equivocados o se aplicaron a una versión diferente a la mía (y, aparentemente, a la tuya).
Puedes comprobar si el tuyo lee desde /dev/random
o /dev/urandom
al rastrearlo:
strace -o a.strace -f -e file java A
y busque la parte relevante de la traza:
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
…
No te preocupes, /dev/urandom
está perfectamente bien para la criptografía.
SecureRandom de Java use /dev/random, pero solo brevemente.
Específicamente, solo lo usa cuando genera información inicial, ya sea llamando explícitamente a SecureRandom.generateSeed()
o por la primera llamada a nextInt()
Entonces, para repetir su ejemplo de bash, puede hacer lo siguiente, y debería bloquearse.
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);
}
}
No solo para mantener vivo un hilo antiguo, sino que algunas personas podrían haberse perdido una parte importante de la larga historia detrás de esto... Se trata de un error infame y persistente muy conocido al usar /dev/urandom desde las versiones de Java 1.4 a las versiones 1.7. Consulte los enlaces a continuación:
http://bugs.java.com/view_bug.do?bug_id=6202721
http://bugs.java.com/view_bug.do?bug_id=4705093
Por lo que sé, esto finalmente se ha abordado en Java 8 como lo indica Oracle:https://docs.oracle.com/javase/8/docs/technotes/guides/security/enhancements-8.html
SHA1PRNG y NativePRNG se corrigieron para respetar correctamente las propiedades de la fuente de semillas SecureRandom en el archivo java.security. (Ya no se requiere la oscura solución utilizando file:///dev/urandom y file:/dev/./urandom).