Según la documentación , los diferentes algoritmos utilizados por SecureRandom son, en orden de preferencia:
- En la mayoría de los sistemas * NIX
- NativePRNG
- SHA1PRNG
- NativePRNGBlocking
- NativePRNGNonBlocking
- En sistemas Windows
- SHA1PRNG
- Windows-PRNG
Dado que usted preguntó acerca de Linux, estoy ignorando la implementación de Windows, y también SunPKCS11, que solo está realmente disponible en Solaris, a menos que lo haya instalado usted mismo, y entonces no lo estaría preguntando.
Según esa misma documentación, lo que usan estos algoritmos son
SHA1PRNG
La inicialización inicial se realiza actualmente mediante una combinación de atributos del sistema y el dispositivo de recolección de entropía java.security.
NativePRNG
nextBytes()
utiliza /dev/urandom
generateSeed()
usos/dev/random
NativePRNGBbloqueo
nextBytes()
y generateSeed()
uso/dev/random
NativePRNGNonBlocking
nextBytes()
y generateSeed()
uso/dev/urandom
Eso significa que si lo usa SecureRandom random = new SecureRandom()
, baja esa lista hasta que encuentre uno que funcione, que generalmente será NativePRNG. Y eso significa que se siembra desde /dev/random
(o usa eso si explícitamente genera una semilla), luego lo usa /dev/urandom
para obtener los siguientes bytes, ints, double, booleans, what-have-yous.
Dado que /dev/random
está bloqueando (bloquea hasta que tiene suficiente entropía en el grupo de entropía), eso puede impedir el rendimiento.
Una solución para eso es usar algo como forjado para generar suficiente entropía, otra solución está usando en su /dev/urandom
lugar. Si bien puede configurarlo para todo el jvm, una mejor solución es hacerlo para esta instancia específica de SecureRandom
, mediante el uso SecureRandom random = SecureRandom.getInstance("NativePRNGNonBlocking")
. Tenga en cuenta que ese método puede generar una NoSuchAlgorithmException si NativePRNGNonBlocking, así que prepárese para recurrir al valor predeterminado.
SecureRandom random;
try {
random = SecureRandom.getInstance("NativePRNGNonBlocking");
} catch (NoSuchAlgorithmException nsae) {
random = new SecureRandom();
}
También tenga en cuenta que en otros sistemas * nix, /dev/urandom
puede comportarse de manera diferente .
¿Es lo /dev/urandom
suficientemente aleatorio?
La sabiduría convencional dice que solo /dev/random
es lo suficientemente aleatorio. Sin embargo, algunas voces difieren. En "La forma correcta de usar SecureRandom" y "Mitos sobre / dev / urandom" , se argumenta que /dev/urandom/
es igual de bueno.
Los usuarios de la pila de seguridad de la información están de acuerdo con eso . Básicamente, si tiene que preguntar, /dev/urandom
está bien para su propósito.