¿Es SecureRandom
seguro el hilo? Es decir, después de inicializarlo, ¿se puede confiar en que el acceso al siguiente número aleatorio es seguro para subprocesos? Examinar el código fuente parece mostrar que lo es, y este informe de error parece indicar que su falta de documentación como seguro para subprocesos es un problema de javadoc. ¿Alguien ha confirmado que de hecho es seguro para subprocesos?
fuente
SecureRandom
no solo puede ser lenta, sino que potencialmente puede bloquearse debido a la falta de entropíaLa implementación actual de
SecureRandom
es segura para subprocesos, específicamente los dos métodos mutantesnextBytes(bytes[])
ysetSeed(byte[])
están sincronizados.Bueno, por lo que he podido decir, todos los métodos de mutación eventualmente se enrutan a través de esos dos métodos y
SecureRandom
anula algunos métodosRandom
para garantizar eso. Lo cual funciona, pero podría resultar frágil si se cambia la implementación en el futuro.La mejor solución es sincronizar manualmente en la
SecureRandom
instancia primero. Esto significa que cada pila de llamadas adquirirá dos bloqueos en el mismo objeto, pero eso suele ser muy económico en las JVM modernas. Es decir, no hay mucho daño en sincronizarse explícitamente. Por ejemplo:fuente
java.security.SecureRandom#nextBytes
en Java 8 no está sincronizado. ¿Podría especificar en qué versión de Java encontró sincronizado#nextBytes
?.