Para una simple invocación de MD5 o SHA-1, una tasa realista es entre 1 y 10 billones de contraseñas por segundo. Eso es lo que se puede lograr con una buena GPU. Además, si el hash no está salado, entonces el atacante puede compartir el esfuerzo entre varias sesiones de ataque, generalmente utilizando tablas precomputadas (por ejemplo, tablas de arco iris ): un atacante, en alguna parte, tenía que hashear millones de posibles contraseñas una vez , pero luego las tablas resultantes se pueden aplicar a miles de hashes con solo un pequeño costo.
Si la función hash es correcta (como se describe en esta respuesta ), luego utiliza un parámetro de ralentización que hace que la función sea tan lenta como se pueda desear. La lentitud afecta tanto al defensor (el servidor honesto que usa el hash para autenticar a los usuarios) como al atacante. Podríamos imaginar, por ejemplo, que el defensor está listo para invertir 10 ms de su propia CPU en cada instancia de hash, lo que significa que el defensor puede manejar 100 hashes de contraseña por segundo. El atacante puede lanzar más PC ante el problema, con múltiples núcleos, y posiblemente usar hardware especializado (GPU, FPGA ...), lo que le puede dar algún impulso; digamos que el atacante puede ser 100 veces más eficiente en el hash de contraseñas que el defensor, lo que lleva a un rendimiento de fuerza bruta de 10000 conjeturas por segundo.
El impulso que el atacante puede obtener a través de hardware especializado depende de la función (por ejemplo, una GPU será buena para atacar a PBKD2 / SHA-256, no tanto para atacar a bcrypt). La cantidad de hardware que el atacante podrá lanzar al problema también depende de los parámetros externos (su presupuesto, su motivación ...). La lentitud utilizada por el defensor es una compensación, porque la mayor lentitud utiliza los recursos del servidor y puede hacerlo más vulnerable a denegación Ataques de servicio .