Diferencia entre java.util.Random y java.security.SecureRandom
Mi equipo recibió un código del lado del servidor (en Java) que genera tokens aleatorios y tengo una pregunta con respecto al mismo:
El propósito de estos tokens es bastante sensible: se utiliza para la identificación de la sesión, los enlaces de restablecimiento de contraseñas, etc. Por lo tanto, deben ser criptográficamente aleatorios para evitar que alguien los adivine o los fuerza bruta. El token es un "largo" por lo que es de 64 bits de largo.
El código utiliza actualmente eljava.util.Random
Clase para generar estos tokens. La documentación ([http://docs.oracle.com/javase/7/docs/api/java/util/Random.html◆◆1]) parajava.util.Random
establece claramente lo siguiente:
Las instancias de java.util.Random no son criptográficamente seguras. En su lugar, considere usar SecureRandom para obtener un generador de números pseudoaleatorios criptográficamente seguro para que lo utilicen las aplicaciones sensibles a la seguridad.
Sin embargo, la forma en que el código está utilizando actualmentejava.util.Random
es esto - crea una instancia deljava.security.SecureRandom
clase y luego usa elSecureRandom.nextLong()
Método para obtener la semilla que se utiliza para instanciar lajava.util.Random
clase. Entonces usajava.util.Random.nextLong()
Método para generar el token.
Así que mi pregunta ahora - ¿Es todavía inseguro dado que lajava.util.Random
está siendo sembrado usandojava.security.SecureRandom
? ¿Necesito modificar el código para que usejava.security.SecureRandom
exclusivamente para generar las fichas?
Actualmente el código de semilla es elRandom
una vez en el inicio