¿Qué hay que tener en cuenta al generar un código aleatorio como parte de la autenticación de dos factores?

7

Quiero escribir un parche para un sistema de autenticación de dos factores que alguien más haya iniciado. El código es un módulo para un sistema de administración de contenido de PHP y envía un mensaje SMS al teléfono de un usuario, luego de que ingresen un nombre de usuario y contraseña exitosamente. Si el usuario escribe el código en el sitio, inicia sesión.

La parte principal que falta en el módulo es el generador de código aleatorio. Estaba considerando basar el generador en el complemento de segundo factor para WordPress . Específicamente, la función second_factor_regenerate_token hace esencialmente lo que necesito. ¿Es el método utilizado por esa función relativamente seguro? ¿Hay algo a lo que deba prestar especial atención cuando lo adapte?

    
pregunta Matt V. 20.02.2012 - 00:04
fuente

2 respuestas

5

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.

    
respondido por el D.W. 20.02.2012 - 01:52
fuente
1

Vea las motivaciones detrás de HOTP , que fue diseñada para este tipo de aplicación.

Algunas de las funciones deseadas son:

  • contraseñas de un solo uso generadas según sea necesario (en este caso, después de que el usuario complete la autenticación primaria)

  • es factible enviar, mostrar en el teléfono del usuario e ingresar

  • es factible verificar en situaciones como solicitudes múltiples de nuevas contraseñas, envíos mal ordenados u omitidos

  • suficiente entropía (no se basa en información conocida como el nombre de usuario o la contraseña del primer factor, no se puede adivinar si se conocen contraseñas anteriores)

Con HOTP, almacena una clave secreta y un contador por usuario, ninguno de los cuales se envía. Para generar una contraseña de un solo uso, hash la clave y el contador, envía el hash e incrementa el contador. Para verificar una contraseña, pise la clave y un rango de contadores y compárelos.

Podrías rodar tu propio en esta línea, pero HOTP es un estándar. Puede encontrar implementaciones revisadas para su sistema y puede encontrar ayuda de la comunidad para decidir si es adecuado para usted.

    
respondido por el Karl Anderson 23.02.2012 - 00:41
fuente

Lea otras preguntas en las etiquetas