Resumen. No, ese código no parece seguro. No tiene suficiente entropía que será impredecible para el adversario. No reutilizaría ese código.
La forma correcta de hacerlo. Para generar un código aleatorio, te sugiero que leas la cantidad deseada de bits de /dev/urandom
. Este es un código de una sola vez, y debe ser aleatorio, no presumible y criptográficamente sólido. Eso es exactamente lo que proporciona /dev/urandom
. El fabricante del sistema operativo ya ha descubierto cómo hacer esto de manera segura, después de pensarlo, y este enfoque ha sido examinado por expertos en seguridad. Le sugiero que simplemente reutilice su trabajo existente.
Análisis de second_factor_regenerate_token
. No sé si estoy entendiendo el código correctamente, pero parece que no tiene suficiente entropía. Hashea el nombre de usuario, la contraseña del usuario, los encabezados HTTP y la hora actual. Eso no es suficiente entropía.
Recuerde que el propósito de un segundo factor es evitar que personas no autorizadas que de alguna manera hayan llegado a conocer el nombre de usuario y la contraseña del usuario obtengan acceso al sistema. (Si la persona no autorizada no conoce el nombre de usuario y la contraseña del usuario, entonces no necesitamos un segundo factor; el primer factor ya los bloquea). Por lo tanto, nuestro análisis debe partir de la suposición de que el atacante conoce el nombre de usuario y la contraseña del usuario. .
Una vez que hacemos esa suposición, la única entropía restante proviene de la hora actual y de los encabezados HTTP. El tiempo definitivamente no tiene suficiente entropía: será conocido, o casi conocido, por el atacante (posiblemente fuera por unos segundos, debido a la sincronización de tiempo imperfecta, pero el atacante puede probar todas las posibilidades). No sé cuánta entropía habrá en los encabezados HTTP, pero no parece una base sólida para la seguridad.
Por lo tanto, basado en mi interpretación de second_factor_regenerate_token
, asumiendo que estoy entendiendo correctamente cómo funciona el código, no creo que represente una buena ingeniería de seguridad. No reutilizaría ese código.