Filtros
Nivel
Artículos (116)
Wiki/Fundamentos/Funciones Hash y HMAC
Básico14 min lectura

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

❌ Roto

Colisiones en segundos con hardware moderno. Solo para checksums no de seguridad (verificación de archivos no críticos).

SHA-1

160 bits

1993

❌ Roto

SHAttered (2017): primera colisión práctica encontrada por Google. Retirado de TLS, certificados y firmas.

SHA-256

256 bits

2001

✅ Seguro

Parte 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

✅ Seguro

Mayor seguridad, más lento. Usado en certificados de alta seguridad y NSA Suite B.

SHA-3 (Keccak)

224/256/384/512 bits

2015

✅ Seguro

Arquitectura completamente diferente (sponge construction). Alternativa si SHA-2 se viera comprometido.

BLAKE3

256 bits

2020

✅ Seguro

Má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 →