HMAC, o Hash-based Message Authentication Code, es un mecanismo para verificar la integridad de los datos y la autenticidad de un mensaje. Combina una función hash criptográfica (como SHA-256 o SHA-3) con una clave secreta. A diferencia de una simple función hash, que solo garantiza la integridad de los datos, HMAC utiliza una clave secreta conocida por el remitente y el receptor para producir un "tag" de autenticación. Este tag se calcula aplicando la función hash dos veces de forma anidada con la clave secreta, lo que lo hace resistente a ataques de extensión de longitud y colisiones que podrían afectar a MACs más simples. La verificación implica que el receptor recalcule el HMAC del mensaje recibido con la misma clave secreta y compare el resultado con el tag adjunto.

HMAC se implementa ampliamente en diversos sistemas y protocolos de seguridad. Por ejemplo, es un componente crítico en IPsec para la autenticación de paquetes, en TLS/SSL para la autenticación de mensajes y en JWT (JSON Web Tokens) para firmar y verificar la autenticidad de los tokens. También se utiliza en protocolos de autenticación como Challenge-Response Authentication Mechanism (CRAM-MD5) y en sistemas de control de versiones como Git para verificar la integridad de los objetos. Herramientas como OpenSSL y bibliotecas criptográficas en la mayoría de los lenguajes de programación (ej. `hmac` en Python, `crypto/hmac` en Go) proporcionan implementaciones estándar de HMAC.

Para un arquitecto, HMAC es fundamental para diseñar sistemas seguros donde la integridad y la autenticidad de los datos son primordiales. Su elección sobre un MAC simple o una firma digital depende del contexto: HMAC es más eficiente computacionalmente que las firmas digitales (que requieren criptografía de clave pública) y es ideal cuando el remitente y el receptor pueden compartir una clave secreta. Sin embargo, no proporciona no repudio, ya que ambas partes poseen la clave. Los trade-offs incluyen la gestión de claves (distribución segura y rotación), la selección de la función hash subyacente (debe ser resistente a colisiones) y la longitud de la clave (generalmente se recomienda al menos 128 bits). Un arquitecto debe considerar si el sistema requiere solo autenticación (HMAC) o también no repudio (firmas digitales) y diseñar la infraestructura de gestión de claves en consecuencia.