Mi equipo recibió un código del lado del servidor (en Java) que genera tokens aleatorios y tengo una pregunta sobre lo mismo:
El propósito de estos tokens es bastante sensible: se usa para identificación de sesión, enlaces de restablecimiento de contraseña, etc. Por lo tanto, deben ser criptográficamente aleatorios para evitar que alguien los adivine o los fuerce de manera bruta. El token es "largo", por lo que tiene 64 bits de largo.
El código actualmente usa la java.util.Random
clase para generar estos tokens. La documentación para java.util.Random
establece claramente lo siguiente:
Las instancias de java.util.Random no son criptográficamente seguras. Considere en su lugar utilizar SecureRandom para obtener un generador de números pseudoaleatorios criptográficamente seguro para uso de aplicaciones sensibles a la seguridad.
Sin embargo, la forma en que el código está usando actualmente java.util.Random
es la siguiente: crea una instancia de la java.security.SecureRandom
clase y luego usa el SecureRandom.nextLong()
método para obtener la semilla que se usa para crear instancias de la java.util.Random
clase. Luego usa el java.util.Random.nextLong()
método para generar el token.
Entonces mi pregunta ahora: ¿sigue siendo inseguro dado que java.util.Random
se está sembrando java.security.SecureRandom
? ¿Necesito modificar el código para que se use java.security.SecureRandom
exclusivamente para generar los tokens?
Actualmente, la semilla del código es la Random
única en el inicio
Random
una vez al inicio, o genera una nueva para cada token? Con suerte, esta es una pregunta estúpida, pero pensé en comprobarlo.
long
o double
valores.