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".
}