Cadena de activación de correo electrónico con MD5 ¿el número aleatorio y el correo electrónico son seguros?

1

Para el registro en mi sitio web con PHP, necesito confirmación por correo electrónico. Después de que un usuario se registra, se genera una cadena con el siguiente código y se envía a su dirección de correo electrónico.

$key = md5(mt_rand(1000,999999).$_POST['email']);

Esa cadena también se almacena en la base de datos, y si el usuario pega la clave correcta en mi página de confirmación, se validará su cuenta.

¿Es seguro el código de generación de claves que usé? Como en, ¿hay alguna forma de determinar la cadena de correo electrónico original si obtuvieran la clave?

    
pregunta Philippe Gray 15.03.2014 - 15:21
fuente

3 respuestas

6

Respuestas breves: No, su generación de claves no es segura. Sí, el atacante puede encontrar el correo electrónico desde el código.

Un atacante puede obtener el código de activación para cualquier dirección de correo electrónico debido a la generación de números aleatorios extremadamente débil. mt_rand() no es adecuado para este propósito , agregue a eso la ventaja obtenida por conocer alguna información sobre el estado de su sistema (tiempo de generación, por ejemplo). Eso puede reducir considerablemente el espacio para las claves potenciales para cada correo electrónico.

En cuanto al otro punto, no creo que sea una preocupación tan grande que el correo electrónico pueda ser forzado desde la clave. Eso debería ser la menor de tus preocupaciones. La clave es, presumiblemente, de corta duración y solo se envía a la dirección de correo electrónico. Tener al propietario de la dirección de correo electrónico averiguando su dirección de correo electrónico es ... bueno, entiendes el punto.

Sin embargo, sí, no es muy difícil forzar el correo electrónico con la clave. Principalmente porque los correos electrónicos no se generan aleatoriamente y es muy probable que existan en diccionarios con algunas otras combinaciones. Su número aleatorio le da aproximadamente 1 millón de combinaciones, eso es muy bajo.

"¿Cómo puedo hacerlo mejor?", preguntas. Es muy simple. Use un método de generación de números aleatorios seguro / API ofrecido por su idioma de elección. En su caso, en PHP, puede utilizar openssl_random_pseudo_bytes() . Aquí hay un ejemplo para su conveniencia:

$activationKey = bin2hex(openssl_random_pseudo_bytes(16)); //128-bit

Después de generar la clave y enviarla al usuario, almacene un hash de la clave en la base de datos. Casi cualquier función hash funcionará, recomiendo SHA-1. Cuando se utiliza la clave / enlace de activación, simplemente la hash y la comparas con la entrada en la base de datos. Después de eso, puede activar la cuenta e invalidar la clave.

    
respondido por el Adi 15.03.2014 - 16:18
fuente
0

Generar el hash no sería un gran problema ya que rand () no es lo suficientemente aleatorio.

Para el generador de claves aleatorias, si está en linux / unix, puede obtener los valores de / dev / urandom en lugar de rand (), lo que sería lo suficientemente bueno para su caso de uso.

Y sí, al enviar un hash válido que consiga una cuenta validada, podrá deducir su dirección de correo electrónico (en ese momento, su aplicación probablemente mostrará la dirección de correo electrónico o el nombre de usuario del usuario en la página de validación que de alguna manera haría lo mismo).

Sin embargo, a pesar de que los correos electrónicos se pueden recuperar de esta manera, diría que no es un problema, ya que puede deducirlo también a través de la página de inicio de sesión o la página de contraseña olvidada si su aplicación no satisface tales condiciones Otro punto sería que, una vez que el usuario haya sido validado, el enlace de validación debe eliminarse de su base de datos para que el atacante ya no pueda deducir el correo electrónico de esa cuenta de correo electrónico. Por lo tanto, las cuentas de correo electrónico que podrían deducirse serían las que no están activas (ya que la cuenta aún no está validada) o cuentas nuevas. Y aún así, no tiene mucho impacto, ya que ganar la dirección de correo electrónico solo no le hará mucho.

Un poco fuera de lugar, pero siento la necesidad de decir esto ya que está algo relacionado.

Aparte de eso, conseguir que los atacantes validen la cuenta de su usuario o obtener la dirección de correo electrónico del usuario no es un gran problema, sin embargo, si permite que el usuario inicie sesión directamente después de validar su cuenta, entonces el atacante podría acceder a la cuenta del usuario que es mala (lo cual también es algo común, desafortunadamente).

Por lo tanto, la forma correcta sería validar solo la cuenta del usuario tras la activación y no permitir que el usuario inicie sesión directamente en su cuenta.

    
respondido por el wcypierre 15.03.2014 - 16:24
fuente
0
  

Al igual que en, ¿hay alguna forma de determinar la cadena de correo electrónico original si obtuvieran la clave?

Dado que un atacante que ya ha obtenido el valor de hash MD5 (es decir, que ha obtenido la clave), ahora es posible un ataque sin conexión.

Dado que oclHashcat con 8x AMD R9 290Xstock core clock puede generar intentos MD5 en más de 80 mil millones (con una B) de pruebas por segundo, y su número aleatorio es ligeramente inferior a un millón, oclHashcat con esas GPU puede probar 80,000 direcciones de correo electrónico diferentes por segundo.

Dado que las direcciones de correo electrónico son muy predecibles, no se usan de forma poco frecuente como contraseñas, normalmente se consideran información pública y están disponibles en forma masiva a partir de violaciones de datos anteriores, así como registros de listas de correo y para la venta, etc., etc. es muy vulnerable a los ataques de diccionario basados en reglas, así como a los ataques combinados (a-z + apellidos + @ hotmail.com o @ yahoo.com o @ gmail.com, por ejemplo).

Además, los números en la parte frontal y final son un truco de contraseñas común que gusta a la gente, por lo que los ataques basados en reglas y los ataques de máscara que comprueban ese tipo de cosas ya están en uso común.

Por lo tanto, sí, la dirección de correo electrónico se puede encontrar solo con el hash que ha enviado si es lo suficientemente común.

    
respondido por el Anti-weakpasswords 15.03.2014 - 15:51
fuente

Lea otras preguntas en las etiquetas