Parte: 2 — Criptografía aplicada · Fuente: Serious Cryptography (Aumasson) y NIST FIPS 180-4 / FIPS 202 ⏱️ Duración estimada: 90 min · Nivel: Intermedio
Comprender qué es una función hash criptográfica, qué tres propiedades debe cumplir (resistencia a preimagen, segunda preimagen y colisión), por qué MD5 y SHA-1 están rotos, y en qué se diferencian SHA-2, SHA-3 (Keccak) y BLAKE2/3. El alumno aprenderá para qué sirven realmente los hashes y para qué no (no cifran, no protegen contraseñas por sí solos).
Al finalizar, el alumno podrá:
| # | Tema | Por qué importa |
|---|---|---|
| 1 | Qué es y qué no es un hash | Evita malentendidos frecuentes |
| 2 | Propiedades (preimagen, colisión) | Definen su seguridad |
| 3 | Efecto avalancha | Un bit cambia toda la salida |
| 4 | MD5 y SHA-1 rotos | Lección de obsolescencia |
| 5 | SHA-2 y Merkle-Damgård | Estándar dominante |
| 6 | SHA-3 (esponja) y BLAKE | Alternativas modernas |
| 7 | Extensión de longitud | Trampa de diseño |
Una función hash criptográfica toma una entrada de cualquier tamaño y produce una salida de tamaño fijo —el digest— de forma determinista. Y aquí conviene desactivar de entrada el malentendido más caro de toda la criptografía aplicada: un hash no es cifrado. No hay clave y no se puede invertir, porque la operación destruye información: infinitas entradas comparten un mismo digest. "Desencriptar un MD5" no significa nada; lo que hacen las herramientas de crackeo es hashear candidatos hasta encontrar uno que coincida, que es un problema completamente distinto.
Su seguridad se define por tres propiedades, en orden creciente de dificultad para el atacante. Resistencia a preimagen: dado un digest, es inviable encontrar alguna entrada que lo produzca. Resistencia a segunda preimagen: dada una entrada concreta, es inviable encontrar otra distinta con el mismo digest. Resistencia a colisión: es inviable encontrar dos entradas cualesquiera que colisionen. A esto se suma el efecto avalancha: cambiar un solo bit de la entrada debe alterar aproximadamente la mitad de los bits de salida, sin ninguna correlación aprovechable.
La resistencia a colisión es siempre la primera en caer, y no por debilidad del diseño sino por combinatoria. La paradoja del cumpleaños dice que en un grupo de 23 personas la probabilidad de que dos compartan cumpleaños supera el 50 %, muy por debajo de las 183 que la intuición sugiere. Trasladado a hashes: encontrar una colisión en una función de n bits cuesta del orden de 2^(n/2) operaciones, no 2^n. Por eso SHA-256 ofrece 128 bits de seguridad frente a colisiones, y por eso un hash de 64 bits es inservible aunque "parezca" grande.
Esa es la aritmética que sentenció a MD5 (colisiones prácticas desde 2004, hoy en segundos) y a SHA-1 (colisión real demostrada por Google en 2017 con el ataque SHAttered). Ninguno de los dos debe usarse ya para nada que dependa de la integridad. Se siguen encontrando como suma de comprobación no criptográfica, pero esa distinción se malinterpreta constantemente y acaba en vulnerabilidades.
SHA-2 (SHA-256, SHA-512) sigue la construcción Merkle-Damgård: procesa el mensaje
en bloques encadenando un estado interno. Es sólida y sigue siendo el estándar dominante,
pero arrastra una peculiaridad estructural con consecuencias reales: el ataque de
extensión de longitud. Como el digest final es el estado interno, quien conozca
H(secreto ‖ mensaje) y la longitud del secreto puede calcular
H(secreto ‖ mensaje ‖ relleno ‖ añadido) sin conocer el secreto. De ahí que
construir un autenticador concatenando clave y mensaje sea un error grave, y de ahí que
exista HMAC (clase 052).
SHA-3 (Keccak) usa una construcción distinta, la esponja, que absorbe la entrada en un estado grande y luego exprime la salida, y por diseño no sufre extensión de longitud. No sustituye a SHA-2 —ambos son estándar— sino que aporta diversidad de diseño: si un día se encontrara un fallo estructural en Merkle-Damgård, existe una alternativa que no comparte el mismo cimiento. BLAKE2 y BLAKE3 completan el panorama con un enfoque orientado a velocidad, muy usados fuera de la normativa.
Y una separación final que se aplica en la clase 057: estas funciones están diseñadas para ser rápidas, que es justo lo contrario de lo que se necesita para almacenar contraseñas. Hashear una contraseña con SHA-256 es un fallo de seguridad, no una optimización.
h, es inviable hallar m con hash(m)=h.m1, es inviable hallar m2≠m1 con igual hash.m1≠m2 con igual hash (limitada por el cumpleaños: ~2^(n/2)).| Término | Definición concisa |
|---|---|
| Función hash criptográfica | Salida de tamaño fijo, determinista y no invertible |
| Digest | Resultado de aplicar la función hash |
| Preimagen | Encontrar una entrada que produzca un digest dado |
| Segunda preimagen | Encontrar otra entrada con el mismo digest que una dada |
| Colisión | Dos entradas cualesquiera con el mismo digest |
| Efecto avalancha | Un bit de entrada cambia ~la mitad de los de salida |
| Paradoja del cumpleaños | Las colisiones cuestan 2^(n/2), no 2^n |
| Bits de seguridad | Coste real del mejor ataque conocido, en potencias de 2 |
| MD5 / SHA-1 | Rotos para integridad; colisiones prácticas |
| SHAttered | Colisión real de SHA-1 demostrada por Google en 2017 |
| SHA-2 | Familia estándar (SHA-256, SHA-512); Merkle-Damgård |
| Merkle-Damgård | Construcción por bloques encadenados; sufre extensión de longitud |
| Extensión de longitud | Extender un hash con secreto sin conocer el secreto |
| SHA-3 / Keccak | Construcción de esponja; inmune a extensión de longitud |
| BLAKE2 / BLAKE3 | Hashes modernos orientados a velocidad |
openssl version
sha256sum --version 2>/dev/null || echo "usa openssl dgst"
pip install cryptography
Todo local. Los hashes se calculan sobre datos propios.
bash
echo -n "hola" | openssl dgst -md5
echo -n "hola" | openssl dgst -sha1
echo -n "hola" | openssl dgst -sha256
echo -n "hola" | openssl dgst -sha3-256
Efecto avalancha: cambia una letra (hola → Hola) y compara el SHA-256; observa que casi todos los bits cambian.
Colisión de MD5 (histórica). Descarga los famosos bloques de colisión de MD5 (p. ej. los PDF de Marc Stevens) y verifica con md5sum que dos archivos distintos comparten hash. Nunca uses MD5 para integridad.
Integridad de archivos: genera sha256sum *.iso > SHA256SUMS y verifica con sha256sum -c SHA256SUMS.
Extensión de longitud (concepto). Explica por qué hash(clave || mensaje) con SHA-256 es vulnerable a extensión y por qué HMAC (clase 052) lo resuelve.
Construye un verificador de integridad que, dado un directorio, genere un manifiesto con el SHA-256 de cada archivo y luego detecte cualquier alteración. Criterio de aceptación: si modificas un solo byte de cualquier archivo, tu verificador lo reporta indicando la ruta afectada.
| Síntoma / mensaje | Causa y cómo arreglar |
|---|---|
| Usar MD5/SHA-1 para integridad de seguridad | Rotos; migra a SHA-256/SHA-3 |
| "Ciframos con SHA-256" | Un hash no cifra; usa AES/ChaCha20 |
hash(clave\|\|msg) como MAC |
Vulnerable a extensión; usa HMAC |
| Hash de contraseña con SHA-256 simple | Demasiado rápido; usa Argon2/bcrypt (clase 057) |
Comparar hashes con == en contexto sensible |
Riesgo de timing; usa comparación constante |
❓ ¿SHA-256 o SHA-3? Ambos son seguros. SHA-3 aporta diversidad de diseño e inmunidad a extensión de longitud; SHA-2 sigue siendo perfectamente válido.
❓ ¿Un hash garantiza que nadie modificó el archivo? Solo si el hash se obtuvo por un canal confiable; si el atacante controla ambos, puede sustituirlos. Combínalo con firmas.
❓ ¿Por qué las colisiones importan si "es improbable"? Porque atacantes las fabrican intencionadamente (SHAttered); afectan firmas y control de versiones.
Clase 050 — Criptografía de curva elíptica (ECC)