(El resumen está en el último párrafo.)
¿Cuánto tiempo tomará para descifrar 1 contraseña? ¿Es el momento de romper 1 mil millones, solo 1e9 * t
?
Imagina que tengo este algoritmo de hash:
function hash(password):
hash = 0
foreach character in password:
hash = hash + toNumber(character)
return hash
Si llama a hash("ab")
, puede devolver 3, ya que el valor numérico del primer carácter podría ser 1 y el segundo podría ser 2, y los suma, lo que da como resultado 3.
Ahora, si tiene una base de datos llena de números, como 583, 140, 8582, etc., ¿cuánto tiempo tomará para descifrarlo?
En este ejemplo, hash("ab")
resultaría en 3 así como en hash("ba")
, lo que se denomina colisión (dos entradas que se asignan a la misma salida). En md5 esto no sucede tan fácilmente. El orden importa y no puede obtener ninguna información sobre la entrada dada la salida. Ni siquiera la longitud.
Así que tienes que recurrir a probar todas las posibilidades hasta que encuentres una que te ofrezca la salida correcta. Si alguien tiene una contraseña fuerte, aleatoria, de 20 caracteres, podría llevar siglos. Pero la mayoría de la gente usa contraseñas como "horselover49", "letmein" o "pene" (aunque este último podría ser demasiado corto), que son mucho más fáciles de descifrar.
La razón por la que todos se quejan del uso de md5 es porque es rápido. Pero los algoritmos de hash están hechos para ser rápidos . MD5 puede romperse para otros propósitos, pero no es para el hashing de contraseñas. Simplemente no debes usar una sola pasada de cualquier algoritmo de hashing, ya sea md5 o sha1 o sha512.
Mejores algoritmos, como bcrypt / scrypt / pbkdf2 / etc. use un algoritmo de hashing un millón de veces (entre otras cosas). Ahora, en lugar de poder ejecutar el algoritmo una vez por cada conjetura, debe ejecutarlo un millón de veces por cada conjetura. Eso lleva mucho más tiempo, lo que le permite probar menos contraseñas, lo que protege mejor las contraseñas débiles.
Entonces, sí, ocurrirá lo mismo que con otras infracciones que utilizaron MD5: se descifrarán muchas contraseñas. Pero no todos serán rajados y definitivamente no en tiempo lineal. Los más fuertes tomarán exponencialmente más tiempo.