Sé por experiencia que la lectura de / dev / random bloquea cuando el grupo de entropía del kernel de Linux se queda sin entropía. Además, he visto muchos artículos y entradas de blog que indican que cuando se ejecuta en Linux, java.security.SecureRandom usa / dev / random como su fuente de entropía y, por lo tanto, bloquea cuando el grupo de entropía del kernel se queda sin entropía.
Sin embargo, no puedo producir un experimento que haga que SecureRandom se bloquee. A la inversa, parece fácil obtener un simple bash de una línea que lee desde / dev / random para bloquear.
Aquí está el código java que estoy usando para estos experimentos:
import java.security.SecureRandom;
public class A {
public static void main(String[] args) {
SecureRandom sr = new SecureRandom();
int out = 0;
for (int i = 0; i < 1<<20 ; i++) {
out ^= sr.nextInt();
}
System.out.println(out);
}
}
Genera poco más de 1,000,000 enteros aleatorios de 32 bits. Eso debería ser 2 ^ (20 + log2 (32)) = 2 ^ 25 bits o 2 ^ 22 (un poco más de 4 millones) bytes de entropía, ¿verdad? Sin embargo, nunca se bloquea. Siempre termina en aproximadamente 1,2 segundos, sin importar si muevo el mouse o no.
El bash one-liner que usé es:
head -c 100 /dev/random | xxd
Esto bloquea fácilmente. Mientras mantengo mi mano alejada del mouse y el teclado, permanecerá allí sin hacer nada durante varios minutos. Y solo pido 100 bytes de entropía.
Seguro que me estoy perdiendo algo aquí. ¿Podría alguien explicar lo que está pasando?
¡Gracias!