Cómo forzar la fuerza bruta de este token en php, si es posible

-6

¿Es posible forzar con fuerza bruta este token (Hash MD5) del siguiente script (PHP) en un tiempo realista (0,5h - 24h)? Si la respuesta es SÍ, ¿cómo podría hacerlo, por ejemplo con PHP o Python?

$time = microtime();
$secret = MD5('$time' . rand(1, 100));
    
pregunta user126623 25.06.2016 - 22:52
fuente

2 respuestas

2

Como está escrito, es bastante fácil, porque PHP no expandirá las variables dentro de comillas simples. Así que '$ time' son los cinco caracteres constantes '$', 't', 'i', 'm', 'e', en lugar de un número muy largo y creciente.

Entonces, esta podría haber sido una pregunta engañosa, para hacer que alguien diga "es muy difícil" cuando en realidad no lo es.

Suponiendo que fue escrito

md5("{$time}".rand(1, 100));

entonces mucho dependería de la precisión real del temporizador de la plataforma atacada. microtime () devolverá un tiempo con microsegundos, pero lo hace llamando a gettimeofday . Por lo tanto, es posible que solo tengas 100,000 intentos en un solo segundo período de tiempo.

Por lo tanto, necesitas romper diez millones de hashes MD5 por cada segundo en tu tiempo. Si sabe que el hash se generó en una hora determinada (hoy entre las 15:30 y las 16:30), es necesario ejecutar 36 000 000 000 intentos.

En un buen hardware puede obtener aproximadamente 2-8 millones de MD5 por segundo , lo que significa que su craqueo debe durar entre 1 y 10 veces más que el tiempo que necesita para resquebrajarse. Por supuesto, usar varias computadoras disminuiría proporcionalmente el tiempo requerido.

En el peor de los casos (verdadera resolución de microsegundos), necesita aproximadamente un día por cada hora de tiempo. Si sabe que un hash se generó entre las 15:30:00 y las 15:30:15 de hoy (15 segundos), puede resolverlo en unos seis minutos.

Actualizar

Por su comentario, si esto es para la seguridad de su sitio, le sugiero encarecidamente que cambie a bcrypt hashes (también, consulte el enlace y la documentación a la que hace referencia).

Luego, para confirmar que dicho token es seguro, puedes enviar un token construido de esta manera:

$secret = 'YourSiteVerySecretPassword';
$date   = date('YmdHis');
// Put whatever you want in the $token.
$token  = "{$username}:{$date}";
$send   = $token . '-' . $bcrypt->hash($secret . $token);

El usuario te enviará un enlace que puedes explotar ('-') en dos partes separadas por un guión:

list($token, $hash) = explode('-', $receivedToken);
if ($bcrypt->verify($secret . $token, $hash)) {
    // Token is valid. You can further explode it using ':',
    // and for example extract the date and time and verify that
    // it is within 24 hours of the current timestamp. Otherwise
    // the token is valid, yes, but it is "stale".
}
    
respondido por el LSerni 25.06.2016 - 23:17
fuente
0

Esto iba a ser un comentario, pero se hizo demasiado largo, y en realidad es una respuesta: probablemente lo estés haciendo de manera incorrecta.

¿Qué uso posible puede tener un atacante para forzar brutalmente el token? El único secreto protegido por el token es la hora y el resultado de la llamada rand ().

Si envía estos tokens por correo al usuario que lo solicita y le solicita que presente el token para restablecer su contraseña, el usuario no tendrá ninguna dificultad en averiguar cuál fue el tiempo de $ cuando hizo la solicitud y obtener el resultado de tu llamada de rand (), pero a él tampoco le importará. Sin embargo, para que usted sepa que el token es válido, debe registrarlo en la base de datos de su sitio web. (Hay formas en las que podría evitar grabar cosas en la base de datos de su sitio web, pero son incluso peores desde el punto de vista de la seguridad o son excesivamente complicadas).

Si un atacante hace una solicitud falsa, no tiene el token, pero sabe el tiempo en menos de un segundo o menos, por lo que con menos de cien mil solicitudes de sitios web puede acertar en el token correcto. El tiempo para hacer el md5 (ya sea en un reloj o en un supercluster) es irrelevante. Si no implementas más protección, es probable que alguien pueda restablecer la contraseña de otra persona, lo que supongo que es lo que estás intentando evitar.

Como, de todos modos, debe registrar la solicitud de restablecimiento de la contraseña en su base de datos, ¿por qué no registra y envía un token totalmente aleatorio (junto con el nombre de usuario o el Id. de solicitud y la fecha de caducidad)?

    
respondido por el Law29 25.06.2016 - 23:48
fuente

Lea otras preguntas en las etiquetas