La evolución del cifrado de contraseñas y que tan difícil es averiguarlas.
Se habla mucho de que hay fugas de información en grandes empresas y que han robado contraseñas y que esas contraseña estaban cifradas, o sea han robado los hashes.
Bien que es un hash:
Imagina que quieres enviar una carta confidencial, pero no quieres que nadie sepa qué dice. Podrías cifrarla. Pero un hash es algo distinto: es como una huella digital única de esa carta.
Si pasas cualquier texto (desde una letra "A" hasta la Biblia entera) por una función de hash, el resultado siempre será una cadena de caracteres de longitud fija. Por ejemplo, en MD5 siempre serán 32 caracteres.
Las 3 reglas de oro de un Hash:
Es unidireccional: Puedes convertir "Contraseña123" en un hash, pero no puedes meter el hash en una máquina y que te devuelva "Contraseña123". Solo puedes adivinarla probando billones de combinaciones (que es lo que estamos haciendo con Hashcat).
Es determinista: La palabra "Hola" siempre, siempre generará el mismo hash. Si cambia una sola coma o un espacio, el hash será totalmente distinto (efecto avalancha).
Es rápido de calcular (para el software): Y como estamos viendo, ¡extremadamente rápido para una tarjeta gráfica!
El problema de la perdida de hashes
Con el tiempo la seguridad ha ido evolucionando, al inicio se usaba MD5, pero un hash MD5 es muy sencillo y los sistemas que lo sigan usando para guardar las contraseñas corren un peligro importante
Vamos a ver un ejemplo, usando hashcat, podemos comprobar en mi caso, con un equipo modesto 16 Mil Millones de hashes por segundo.
Ej:
Speed.#01........: 16893.2 MH/s (11.99ms) @ Accel:17 Loops:1024 Thr:512 Vec:8
Es importante tener las contraseñas cifradas, pero una web debe ir evolucionando, no solo es usar algún hash y ya, es ir cambiando con los años y muchos esta claro que no lo hacen por la perdida de información que se ha tenido y cuantos hashes se han sacado.
| Algoritmo | Velocidad de crackeo | Tiempo para 9 caracteres | |
| MD5 | 16.8 GH/s | ~18 días | Un atacante lo rompe en vacaciones. |
| SHA-256 | ~5.2 GH/s | ~60 días | Sigue siendo inseguro para contraseñas. |
| BCrypt | ~12 kH/s | Milenios | Aquí es donde la GPU "sufre" de verdad. |
| Argon2id | ~200 H/s | Imposible | El muro que toda empresa debería usar. |
Esto aplica para ataques de fuerza bruta
¿ Que es un ataque de fuerza bruta ?
Es cuando no se sabe nada de la contraseña, no se sabe cuantos caracteres tiene, no se sabe si tiene letras solo, números, mayúsculas o símbolos, así que toca hacer un ataque.
Básicamente es empezar a combinar todo, ver si la contraseña es a o ab, abc, abdc, a1, a2, abdc1, abdc$ y así infinitamente con todas las combinaciones.
Para 9 caracteres de longitud letras en mayúsculas y minúsculas, números y 4 símbolos hay que probar 27206534396294947 contraseñas. o sea 27 mil billones de combinaciones y ahí es donde la tabla de arriba es importante, de 16 mil millones de hasesh por segundo a 200 hashes por segundo, es que no tiene sentido hacer un ataque de fuerza bruta ni a bcrypt, ni a sha512 con +5000 interacciones y si vez argonid2 ni aunque tengas un ordenador cuántico podrías conseguir la contraseña si el uso de RAM esta en mas de 256 MB asignados
Y aquí es donde entra la evolución de los hashes que va de la mano con la evolución del hardware, cuando salio md5 no habían equipo que pudieran probar 16 mil millones de contraseñas por segundo así que con el paso del tiempo ha ido evolucionando de esta forma:
1. La era de la velocidad: MD5 y SHA
Al principio, los hashes (como MD5) se diseñaron para ser lo más rápidos posible. Se usaban para comprobar que un archivo no se hubiera corrompido al descargarlo.
El error: Las empresas empezaron a usarlos para guardar contraseñas.
El problema: Como eran tan rápidos, una GPU moderna podía probar miles de millones de combinaciones por segundo. Si te robaban la base de datos, tus contraseñas eran "transparentes".
2. La llegada del "Salt"
Antes del Salt, si diez usuarios usaban la misma contraseña "123456", sus diez hashes en la base de datos eran idénticos. Un hacker podía usar una Rainbow Table (una tabla pre-calculada con millones de hashes) y crackear miles de cuentas en un segundo.
La solución: El Salt. Es un número aleatorio que se añade a la contraseña antes de hashearla.
El resultado: Ahora, aunque diez personas usen "123456", cada una tiene un hash totalmente distinto. El hacker ya no puede usar tablas pre-calculadas; tiene que atacar cada cuenta de una en una.
3. Las Iteraciones (Hacerlo lento a propósito)
Con el Salt, el hacker aún podía usar la fuerza bruta. Entonces los ingenieros pensaron: "¿Y si obligamos a la computadora a repetir el hash 10.000 veces antes de darle el resultado?".
Concepto: Aparecen algoritmos como PBKDF2 o SHA-512Crypt.
El impacto: Para un usuario que se loguea una vez, esperar 0.2 segundos no es nada. Pero para un hacker con una GPU que intenta probar billones de combinaciones, ese retraso de 0.1 segundos multiplicado por billones hace que el ataque tarde siglos.
4. Memory-Hard: La criptografía contra la GPU
Las GPUs son rápidas porque tienen miles de núcleos pequeños que hacen cálculos matemáticos simples muy rápido, pero cada núcleo tiene muy poca memoria RAM propia.
La innovación (Argon2, Scrypt): Los algoritmos Memory-Hard obligan al procesador a llenar varios Megabytes de RAM con datos aleatorios y leerlos constantemente mientras calcula el hash.
El jaque mate: Como la GPU no tiene suficiente RAM dedicada para cada uno de sus miles de núcleos, no puede procesar estos hashes en paralelo. Su gran ventaja (la velocidad masiva) desaparece, y se vuelve casi tan lenta como una CPU normal.
Esa parte me ha ayudado la IA a explicarlo de forma resumida ya que me enrollo mucho, se el concepto pero no lo explicaría así.
No fiarnos de nadie y usar contraseñas distintas
En temas de seguridad no podemos fiarnos de que las empresa hayan actualizado sus algoritmos internos, nadie garantiza que un ecomerce que nació en el 2000 haya dejado de usar con el tiempo md5 o md5crypt y haya pasado a bcrypt o argon para guardar sus hashes, así que tu contraseña puede ser muy larga pero si el hash es anticuado la seguridad no es la misma, 20 caracteres en 20 con md5 es peor que 12 caracteres en argon2id ante un ataque de diccionario.
Por eso debemos usar contraseñas distintas en todos los sitios en los que nos registramos, si un sitio es comprometido y por un casual usa algún hash antiguo para guardar la contraseña no podemos correr el riesgo de vernos comprometidos, para curarnos en salud usaremos contraseñas distintas en todos los sitios webs.
Si usas keepass o luks2 estos ya soportan argon2id, sacrificamos unos segundos si asignamos +256 MB de RAM a la contraseña pero nos da una tranquilidad que no esta pagada.
Ahora espero que quede claro por que hay que usar contraseñas distintas en todo lado.