2010-09-09 8 views
7

Cuando los usuarios registran una cuenta, reciben un correo electrónico con un código de verificación en el que pueden hacer clic para verificar sus cuentas.Es MD5 una buena forma de generar código de verificación de cuenta

Así es como genero el código de verificación.

md5(rand(0,1000) 

¿Está utilizando el siguiente método como una mala opción? Genera un número aleatorio entre 0-1000. Dado que sólo hay 1.000 opciones, y se conocen sus hash MD5, se debe tomar un atacante sólo unos 1.000 ensayos para verificar la cuenta sin que realmente pertenece a ellos

+0

"debería llevar a un atacante solo 1000 pruebas para verificar la cuenta sin que realmente le pertenezca" Es por eso que también necesita una limitación de velocidad. – NullUserException

+0

@NullUserException ¿qué tasa limitas? Los atacantes usarán múltiples direcciones IP e intentarán registrar varias cuentas ... –

Respuesta

3

Sólo las semillas con algo que el atacante no podría saber:

md5(rand(0,1000).'helloworld234'); 

no hay límite de lo que podría ir crasy

md5(md5(time().'helloguys'.rand(0,9999))); 

de manera demasiado pero se entiende la idea.

+4

cuanta más entropía, mejor. Pondría al menos la identificación de usuario o el correo electrónico de la persona que se registra, junto con el tiempo, con la mayor precisión posible. –

+3

@John Bueno, yo enseñé de sugerir algunas semillas generadas por el giro de un átomo, pero usted sabe el costo y todo eso. – Iznogood

+0

rand() es horrible y nunca debe usarse para seguridad, mt_rand() es mejor. Además, el atacante sabe que time(), él es el que está creando la cuenta. – rook

1

rand (1,1000) son 10 bits de entropía. MD5ing no agrega ninguno. En promedio, un atacante tardará 500 intentos en verificar una cuenta. Ninguna cantidad de limitación de velocidad lo ayudará, ya que los atacantes expertos alquilarán o ya tendrán una botnet que se usará para validar las cuentas.

Juega a lo seguro y tienes 128 bits de entropía en tus enlaces de verificación. En PHP openssl_random_pseudo_bytes(16, true) es la forma portátil de obtener bytes aleatorios criptográficamente fuertes, pero si aloja bajo alguna distribución de Linux o uno de los sistemas operativos BSD, leer/dev/urandom también es una opción aceptable.

También pregunte si es prudente verificar cuentas, mucha gente usa correos electrónicos imposibles de rastrear exactamente para eso (y ninguna de las listas negras no estará actualizada).

+0

Bonito downvoting sin una razón ... –

Cuestiones relacionadas