Parte: 2 — Criptografía aplicada · Fuente: Cryptography Engineering (Ferguson/Schneier/Kohno) e IETF RFC 2104 ⏱️ Duración estimada: 90 min · Nivel: Intermedio
Entender qué es un código de autenticación de mensajes (MAC), por qué la integridad sin autenticación no basta, y cómo HMAC combina una función hash con una clave secreta para garantizar que un mensaje proviene de quien dice y no fue alterado. El alumno aprenderá también el orden correcto de combinar cifrado y MAC (Encrypt-then-MAC) y por qué la comparación debe ser en tiempo constante.
Al finalizar, el alumno podrá:
| # | Tema | Por qué importa |
|---|---|---|
| 1 | MAC: definición y objetivo | Autenticidad de mensajes |
| 2 | Construcción HMAC | Estándar seguro y simple |
| 3 | HMAC vs hash con clave concatenada | Evita extensión de longitud |
| 4 | Encrypt-then-MAC vs MAC-then-Encrypt | Orden correcto |
| 5 | Comparación en tiempo constante | Evita fugas de timing |
| 6 | Claves y rotación | Gestión práctica |
| 7 | HMAC en la práctica (JWT, APIs) | Uso real |
HMAC(k,m) = H((k⊕opad) || H((k⊕ipad) || m)). Seguro con cualquier hash decente, inmune a extensión de longitud.openssl version
pip install cryptography
Laboratorio local. Las claves de HMAC son de práctica.
bash
echo -n "mensaje" | openssl dgst -sha256 -hmac "clave-secreta"
python
import hmac, hashlib
key = b"clave-secreta"
tag = hmac.new(key, b"mensaje", hashlib.sha256).hexdigest()
# verificación en tiempo constante
ok = hmac.compare_digest(tag, tag)
print(tag, ok)
Detecta manipulación: envía (mensaje, tag); el receptor recomputa el HMAC. Cambia un carácter del mensaje y comprueba que la verificación falla.
Encrypt-then-MAC: cifra con AES-CBC, calcula HMAC-SHA256 sobre IV || ciphertext, y verifica el MAC antes de descifrar. Documenta por qué esto previene padding oracle (clase 060).
Timing (concepto): implementa una comparación ingenua byte a byte con salida temprana y razona por qué filtra información; sustitúyela por compare_digest.
hash(clave || mensaje) es inseguro y HMAC no.Implementa un canal autenticado sencillo: el emisor envía (IV, ciphertext, HMAC) y el receptor rechaza cualquier mensaje manipulado sin descifrarlo. Criterio de aceptación: alterar cualquier byte del IV, del texto cifrado o del tag provoca rechazo, y solo los mensajes íntegros se descifran.
| Síntoma / mensaje | Causa y cómo arreglar |
|---|---|
| MAC-then-Encrypt con CBC | Habilita padding oracle; usa Encrypt-then-MAC o AEAD |
Comparar tags con == |
Fuga de timing; usa compare_digest |
| Reutilizar la clave de cifrado como clave de MAC | Debilita ambas; deriva claves separadas |
| Verificar el MAC después de descifrar | Ya procesaste datos no autenticados; verifica antes |
| Hash simple como "firma" de API | No autentica origen; usa HMAC con clave secreta |
❓ ¿HMAC o AEAD? Si ya cifras, prefiere AEAD (GCM, ChaCha20-Poly1305), que integra el MAC. HMAC brilla para autenticar datos que no ciframos (tokens, webhooks).
❓ ¿Puedo usar HMAC-MD5? HMAC-MD5 resiste mejor que MD5 solo, pero usa HMAC-SHA256 por buenas prácticas.
❓ ¿El MAC da confidencialidad? No; solo autenticidad e integridad. Combínalo con cifrado para confidencialidad.
Clase 051 — Funciones hash: SHA-2, SHA-3 y sus propiedades