¿SecureRandom
es seguro? Es decir, después de inicializarlo, ¿se puede confiar en que el acceso al siguiente número aleatorio sea seguro para la ejecución de subprocesos? Al examinar el código fuente parece mostrar que sí, y this bug report parece indicar que su falta de documentación como hilo seguro es un problema de Javadoc. ¿Alguien ha confirmado que, de hecho, es seguro para subprocesos?¿SecureRandom es seguro para subprocesos?
Respuesta
Sí, lo es. Se extiende Random
, que siempre se tenía de hecho una aplicación multi-hilo, y, a partir Java 7, explicitly guarantees threadsafety.
Si muchos hilos están utilizando un solo SecureRandom
, puede haber contención que perjudica el rendimiento. Por otro lado, la inicialización de una instancia SecureRandom
puede ser relativamente lenta. Si es mejor compartir un RNG global, o crear uno nuevo para cada hilo dependerá de su aplicación. La clase ThreadLocalRandom
se puede usar como un patrón para proporcionar una solución que admita SecureRandom
.
Sí. Es totalmente seguro para subprocesos. En realidad, me quejaría de que el candado es demasiado agresivo. Todo el engineNextBytes()
está sincronizado.
Para ser franco con usted, no sabría si no es seguro. La cuestión de roscado, probablemente, se introduce una mayor aleatoriedad :)
Es * Seguro * Aleatorio, es muy importante usarlo con precisión. No creo que introduzca más aleatoriedad. P.ej. Al azar seguro no hilo podría producir el mismo número aleatorio en varios hilos - podría significar que un hilo podría robar un número generado por otro hilo, podría ser explotado por un pirata informático. – kan
La implementación actual de SecureRandom
es seguro para subprocesos, específicamente los dos métodos de mutación nextBytes(bytes[])
y setSeed(byte[])
están sincronizados.
Bueno, por lo que he podido decir, todos los métodos de mutación finalmente se enrutan a través de esos dos métodos, y SecureRandom
anula algunos métodos en Random
para garantizar que. Lo cual funciona, pero podría ser frágil si la implementación cambia en el futuro.
La mejor solución es sincronizar manualmente en la instancia SecureRandom
primero. Esto significa que cada pila de llamadas adquirirá dos bloqueos en el mismo objeto, pero eso suele ser muy barato en las JVM modernas. Es decir, no hay mucho daño en sincronizarse explícitamente. Por ejemplo:
SecureRandom rnd = ...;
byte[] b = new byte[NRANDOM_BYTES];
synchronized (rnd) {
rnd.nextBytes(b);
}
- 1. ¿Cómo es seguro ActiveSupport :: SecureRandom?
- 2. NSTimer ¿es seguro para subprocesos?
- 3. ¿PrintWriter es seguro para subprocesos?
- 4. Enum.TryParse - ¿es seguro para subprocesos?
- 5. ¿Es PHP seguro para subprocesos?
- 6. ¿MongoDB es seguro para subprocesos?
- 7. ¿Es itertools seguro para subprocesos?
- 8. ¿DWScript es seguro para subprocesos?
- 9. ¿SQLite.Net es seguro para subprocesos?
- 10. ¿Es System.ServiceModel.Channels.BufferManager seguro para subprocesos?
- 11. ¿HttpContext.Current.Cache es seguro para subprocesos?
- 12. ¿Stream.Write es seguro para subprocesos?
- 13. EventAggregator, ¿es seguro para subprocesos?
- 14. guava-libraries: ¿es Iterators.cycle() seguro para subprocesos?
- 15. ¿Es TimeZone de Java seguro para subprocesos?
- 16. Java Transport.send() ¿es seguro para subprocesos?
- 17. C socket API es seguro para subprocesos?
- 18. ¿List-it() es seguro para subprocesos?
- 19. Log4Net FileAppender no es seguro para subprocesos?
- 20. ¿Este código es seguro para subprocesos? ¿Cómo puedo hacer que sea seguro para subprocesos?
- 21. C++ Segmento seguro para subprocesos
- 22. C# Singleton seguro para subprocesos
- 23. malloc() no es reentrante pero es seguro para subprocesos?
- 24. ¿Es HashMap seguro para subprocesos para diferentes claves?
- 25. ¿Es seguro leer de varios subprocesos?
- 26. ¿El operador + = es seguro para subprocesos en Python?
- 27. ¿Por qué este código no es seguro para subprocesos?
- 28. Fábrica de objetos singleton: ¿este código es seguro para subprocesos?
- 29. ¿El retorno de rendimiento en C# es seguro para subprocesos?
- 30. ¿DocumentBuilderFactory es seguro para subprocesos en Java 5+?
Gracias por la actualización. Curiosamente, el error está marcado como "no se arregla". Pero lo arreglaron de todos modos. Oh, bueno, no les envidio el tamaño de su base de datos de errores. – Yishai
inicializar un 'SecureRandom' no solo puede ser lento, sino que también puede bloquearse debido a la falta de entropía –
@WalterTross ¿Se bloquea? He visto que los sistemas tardan 10 o 15 minutos, pero nunca he visto uno colgado. Una implementación que no está garantizada para continuar alimentando su grupo de entropía, aunque lentamente, parece un error en el sistema operativo. – erickson