Funciones Hash: SHA-256 y HMAC
MD5, SHA-1, SHA-256, SHA-3 y HMAC para integridad y autenticación de mensajes
¿Qué es una Función Hash Criptográfica?
Una función hash toma una entrada de longitud arbitraria y produce una salida de longitud fija llamada digest o hash. Para ser criptográficamente segura debe cumplir tres propiedades:
Pre-image resistance
Dado h, imposible encontrar m tal que H(m) = h. La función es de sentido único.
Second pre-image resistance
Dado m₁, imposible encontrar m₂ ≠ m₁ con H(m₁) = H(m₂).
Collision resistance
Imposible encontrar cualquier par m₁ ≠ m₂ con H(m₁) = H(m₂).
// Ejemplo: mismo hash para cualquier input
SHA-256("Hola")
= 9c15dc3a0a2c60cb6d5f2e1b8e9c6478...
SHA-256("hola") ← un carácter diferente
= 6b86b273ff34fce19d6b804eff5a3f57... ← hash completamente diferente (avalanche effect)
Algoritmos: Estado Actual
MD5
128 bits
1991
❌ RotoColisiones en segundos con hardware moderno. Solo para checksums no de seguridad (verificación de archivos no críticos).
SHA-1
160 bits
1993
❌ RotoSHAttered (2017): primera colisión práctica encontrada por Google. Retirado de TLS, certificados y firmas.
SHA-256
256 bits
2001
✅ SeguroParte de SHA-2. Estándar de facto para TLS, Git, Bitcoin, JWT (HS256). Ampliamente implementado con aceleración hardware.
SHA-384 / SHA-512
384/512 bits
2001
✅ SeguroMayor seguridad, más lento. Usado en certificados de alta seguridad y NSA Suite B.
SHA-3 (Keccak)
224/256/384/512 bits
2015
✅ SeguroArquitectura completamente diferente (sponge construction). Alternativa si SHA-2 se viera comprometido.
BLAKE3
256 bits
2020
✅ SeguroMás rápido que SHA-256 y MD5. Paralelizable. Usado en Rust toolchain, Bao, Zig. Aún no en muchos estándares.
HMAC — Hash-based Message Authentication Code
Un hash solo verifica integridad, pero no autenticidad: cualquiera puede calcular SHA-256("mensaje"). HMAC resuelve esto combinando el hash con una clave secreta:
// Construcción HMAC (RFC 2104)
HMAC(K, m) = H((K ⊕ opad) ∥ H((K ⊕ ipad) ∥ m))
// En práctica con Node.js:
const hmac = crypto.createHmac('sha256', secretKey)
hmac.update(payload)
const mac = hmac.digest('hex')
Usos de HMAC
- • JWT con HS256 (HMAC-SHA256)
- • Cookies firmadas (Rails, Django)
- • API keys (AWS Signature v4)
- • Integridad de webhooks (GitHub, Stripe)
No confundir con...
- • Hash simple: no autentica el origen
- • Cifrado: HMAC no cifra, solo autentica
- • Firma digital: HMAC es simétrico (misma clave para crear y verificar)
Ataques Comunes
Length extension attack
Contra SHA-2 cuando se usa mal: H(key ∥ message). Un atacante puede extender el mensaje sin conocer la clave. Solución: usar HMAC correctamente.
Collision attack
Encontrar dos inputs con el mismo hash. Práctico en MD5 y SHA-1. Permite falsificar documentos (ej. crear PDFs con mismo SHA-1).
Rainbow tables
Tablas precomputadas de hashes para passwords comunes. Solución: usar salt único por usuario al hashear contraseñas. (Ver: Password Hashing).
Timing attack
Comparar hashes con == en lugar de crypto.timingSafeEqual() filtra información por tiempo de respuesta. Usar siempre comparación de tiempo constante.
Buenas Prácticas
Usar SHA-256 o SHA-3 para hashing de datos, firmas y checksums.
Nunca usar MD5 o SHA-1 para funciones de seguridad.
Para autenticar mensajes con clave compartida, usar HMAC-SHA256.
Comparar hashes con función de tiempo constante (timingSafeEqual).
Para contraseñas, usar Argon2id/bcrypt/scrypt — NO SHA-256 directo.
Incluir salt aleatorio de 16+ bytes cuando se hashean contraseñas.
Siguiente Paso
Entiende cómo la PKI usa estas primitivas para crear una infraestructura de confianza
PKI y Certificados Digitales →