Tema 16
Verificar que un mensaje no fue alterado es importante, pero en muchos sistemas no alcanza con integridad: también hace falta comprobar que el mensaje proviene de quien posee una clave válida. Los MAC y HMAC resuelven exactamente ese problema en entornos de clave compartida, combinando integridad y autenticidad de manera eficiente.
Hasta aquí vimos funciones hash, que sirven para resumir información y detectar cambios, y también firmas digitales, que permiten verificar autoría con criptografía asimétrica. Entre ambos extremos hay otro mecanismo muy importante: los códigos de autenticación de mensajes, o MAC.
Un MAC permite que dos partes que comparten una clave secreta verifiquen no solo que un mensaje no fue modificado, sino también que fue generado por alguien que conoce esa clave. Esto lo vuelve una herramienta central en protocolos, APIs, sesiones seguras y múltiples esquemas simétricos.
MAC significa Message Authentication Code. Es un valor corto calculado a partir de un mensaje y una clave secreta compartida. El receptor, que conoce la misma clave, puede recalcular el MAC y comprobar si coincide.
Si coincide, el sistema concluye dos cosas:
Un MAC está pensado para ofrecer:
No aporta no repudio en el sentido fuerte de las firmas digitales, porque ambas partes comparten la misma clave y cualquiera de ellas podría haber generado el código.
Esta diferencia es crucial. Un hash simple de un mensaje puede ser calculado por cualquiera, porque no requiere secreto. Por lo tanto, un atacante que modifique el mensaje también puede recalcular el hash correspondiente.
Un MAC, en cambio, incorpora una clave secreta. Si el atacante no conoce esa clave, no debería poder generar un nuevo MAC válido para el mensaje alterado.
También es importante diferenciar MAC de firma digital. Ambos pueden servir para autenticidad e integridad, pero operan bajo modelos distintos.
| Aspecto | MAC/HMAC | Firma digital |
|---|---|---|
| Tipo de clave | Compartida | Pública/privada |
| Integridad | Sí | Sí |
| Autenticidad | Sí, entre partes que comparten secreto | Sí, verificable públicamente |
| No repudio | No | Sí, en el modelo adecuado |
| Rendimiento | Muy alto | Menor |
HMAC significa Hash-based Message Authentication Code. Es una construcción específica que usa una función hash criptográfica junto con una clave secreta para producir un MAC robusto.
La gran ventaja de HMAC es que permite aprovechar funciones hash bien estudiadas como SHA-256 o SHA-512, pero de una manera diseñada cuidadosamente para autenticación con clave. No consiste simplemente en "agregar una clave al hash" de forma ingenua.
Una idea intuitiva pero peligrosa sería concatenar una clave al mensaje y aplicar un hash normal. Sin embargo, ese tipo de diseño casero puede sufrir debilidades según la función usada y la forma exacta de combinación.
HMAC existe justamente para evitar esas construcciones improvisadas y ofrecer una fórmula estandarizada, analizada y robusta.
Sin entrar en todos los detalles internos, HMAC combina la clave con dos constantes estructurales distintas y aplica la función hash en dos capas. Ese diseño evita problemas que podrían aparecer con combinaciones más simples.
Lo importante a nivel conceptual es que HMAC transforma una función hash en un mecanismo de autenticación con clave compartida que resiste mejor ciertos ataques estructurales.
HMAC es muy popular porque ofrece una combinación atractiva:
La seguridad de HMAC depende en parte de la función hash subyacente, pero no exactamente del mismo modo que un uso simple de la función hash. En práctica moderna suelen usarse HMAC-SHA-256 o HMAC-SHA-512. También existen variantes con SHA-1 históricas, aunque hoy no se recomiendan para nuevos sistemas.
Como regla general, conviene elegir una función hash vigente y robusta, como las familias SHA-2 o SHA-3 cuando corresponda.
Un uso muy común de HMAC aparece en APIs, webhooks y protocolos donde dos sistemas comparten un secreto. El emisor calcula un HMAC sobre el contenido o sobre una parte bien definida de la solicitud, y el receptor recalcula ese mismo valor para verificar que la petición no fue manipulada.
Esto ayuda a detectar alteraciones y a confirmar que el mensaje proviene de una parte autorizada.
Un HMAC por sí solo no evita necesariamente ataques de replay, donde un atacante reenvía un mensaje válido antiguo. Para mitigar ese problema, el diseño suele incorporar timestamp, nonce, contador o identificadores únicos dentro de los datos autenticados.
Así, aunque el HMAC sea válido, el sistema puede detectar que el mensaje no corresponde a una operación nueva.
Un error común es pensar que HMAC cifra. No cifra nada. El mensaje puede seguir siendo completamente visible. Lo que HMAC protege es su integridad y su origen dentro de un contexto de clave compartida.
En sistemas reales, muchas veces se combina cifrado para confidencialidad con HMAC para integridad y autenticación.
No todos los MAC dependen de funciones hash. Existen también MACs construidos a partir de cifrados por bloques, como CMAC. Sin embargo, HMAC es una de las construcciones más extendidas y didácticas porque se apoya en hashes que ya estudiamos.
Entender HMAC ayuda a comprender el principio general: autenticación con clave compartida sobre mensajes potencialmente visibles.
La clave secreta usada en un MAC o HMAC es crítica. Si se filtra, un atacante puede generar códigos válidos para mensajes arbitrarios. Por eso la seguridad del mecanismo no depende solo del algoritmo, sino también de:
| Mecanismo | Usa clave | Verifica integridad | Verifica autenticidad | No repudio |
|---|---|---|---|---|
| Hash simple | No | Sí, si la referencia es confiable | No | No |
| HMAC | Sí, compartida | Sí | Sí, entre quienes comparten el secreto | No |
| Firma digital | Sí, privada/pública | Sí | Sí | Sí, en el modelo adecuado |
HMAC aparece en muchísimos sistemas reales:
MAC y HMAC ocupan un lugar clave entre el hash simple y la firma digital: permiten verificar integridad y autenticidad de mensajes cuando dos partes comparten un secreto, con muy buen rendimiento y amplia aplicabilidad práctica.
En el próximo tema estudiaremos firmas digitales, certificados y PKI, para pasar del modelo de autenticación con secreto compartido al modelo de confianza pública y validación de identidades.