He estado leyendo sugerencias para usar fórmulas que consumen mucho tiempo para verificar las contraseñas de los intentos de inicio de sesión, para que los ataques repetidos se desaceleren.
¿No sería suficiente dormir un poco en la función que verifica la contraseña?
Ejemplo simplificado:
function check_password($user) {
usleep(1000);
return crypt($_POST["password"], $user->password) == $user->password;
}