HMAC Explicado: Cómo Funciona la Autenticación de Mensajes Basada en Hash

16 Jun 2026 909 words

HMAC Explicado

HMAC (Código de Autenticación de Mensajes Basado en Hash) es un mecanismo para verificar tanto la integridad como la autenticidad de un mensaje utilizando una función hash criptográfica combinada con una clave secreta. A diferencia del hash simple, que cualquiera puede calcular, HMAC requiere conocimiento de la clave secreta para generar o verificar el código de autenticación.

Un hash simple como SHA256 te dice que un mensaje no ha cambiado, pero no prueba quién lo creó. Un atacante que modifique el mensaje simplemente puede recalcular el hash, y el destinatario no tiene forma de detectar la manipulación. HMAC resuelve esto incorporando una clave secreta en el cálculo del hash. Solo alguien con la clave puede producir un HMAC válido, lo que lo hace adecuado para autenticar mensajes entre partes que comparten un secreto.

Cómo Funciona HMAC

HMAC utiliza dos pasadas de la función hash con la clave secreta. El algoritmo está definido en RFC 2104 y funciona de la siguiente manera:

  1. La clave secreta se rellena hasta el tamaño de bloque de la función hash
  2. La clave rellenada se aplica XOR con una constante de relleno interno (ipad = 0x36 repetido)
  3. El mensaje se adjunta a la clave de relleno interno
  4. El resultado se hashea
  5. La clave rellenada se aplica XOR con una constante de relleno externo (opad = 0x5C repetido)
  6. El hash del paso 4 se adjunta a la clave de relleno externo
  7. El resultado se hashea nuevamente
HMAC(K, m) = H((K' ⊕ opad) || H((K' ⊕ ipad) || m))

Este enfoque de doble hash previene los ataques de extensión de longitud y asegura que incluso si la función hash subyacente tiene debilidades, la construcción HMAC permanece segura.

HMAC vs Hash Simple

Característica Hash Simple (SHA256) HMAC-SHA256
Clave requerida No
Verificación de integridad
Autenticación No
Detección de manipulación Recalcular completo Detección sin clave
Mejor para Sumas de verificación de archivos Autenticación de API
Extensión de longitud Vulnerable Resistente

Casos de Uso Comunes

Autenticación de API — el cliente firma cada solicitud con HMAC usando un secreto compartido. El servidor recalcula el HMAC y lo compara. Si coinciden, la solicitud es auténtica.

Firma de tokens JWT — aunque JWT normalmente usa HMAC o RSA más simples, HMAC es un algoritmo válido para JWT (HS256, HS384, HS512).

Verificación de webhooks — servicios como Stripe, GitHub y Slack firman los payloads de webhooks con HMAC para que puedas verificar que provienen del servicio.

Tokens de sesión — HMAC puede generar tokens de sesión infalsificables sin almacenarlos en una base de datos.

Ejemplos de Código

PHP

$secret = 'my-secret-key';
$message = 'message-to-authenticate';

// Generar HMAC
$hmac = hash_hmac('sha256', $message, $secret);
echo $hmac;

// Verificar HMAC
$expected = hash_hmac('sha256', $message, $secret);
if (hash_equals($expected, $providedHmac)) {
    echo 'Auténtico';
}

Python

import hmac
import hashlib

secret = b'my-secret-key'
message = b'message-to-authenticate'

# Generar HMAC
hmac_value = hmac.new(secret, message, hashlib.sha256).hexdigest()
print(hmac_value)

# Verificar HMAC (comparación en tiempo constante)
expected = hmac.new(secret, message, hashlib.sha256).digest()
received = bytes.fromhex(provided_hmac)
if hmac.compare_digest(expected, received):
    print('Auténtico')

JavaScript (Node.js)

const crypto = require('crypto');

const secret = 'my-secret-key';
const message = 'message-to-authenticate';

// Generar HMAC
const hmac = crypto.createHmac('sha256', secret)
    .update(message)
    .digest('hex');
console.log(hmac);

// Verificar
const expected = crypto.createHmac('sha256', secret)
    .update(message)
    .digest();

Algoritmos HMAC

HMAC puede usar cualquier función hash criptográfica. El nombre del algoritmo típicamente combina "HMAC" con el nombre del hash.

Algoritmo Función Hash Tamaño de Salida
HMAC-MD5 MD5 128 bits
HMAC-SHA1 SHA-1 160 bits
HMAC-SHA256 SHA-256 256 bits
HMAC-SHA512 SHA-512 512 bits
HMAC-SHA3-256 SHA3-256 256 bits

Usa HMAC-SHA256 como predeterminado. HMAC-MD5 y HMAC-SHA1 están obsoletos para aplicaciones de seguridad.

Consideraciones de Seguridad

Tamaño de clave — la clave debe tener al menos la longitud de la salida del hash. Para HMAC-SHA256, usa una clave de al menos 32 bytes (256 bits). Las claves más largas se reducen al tamaño de bloque mediante hash.

Secreto de la clave — la seguridad de HMAC depende completamente de que la clave sea secreta. Usa un sistema de gestión de claves o variables de entorno. Nunca hardcodees claves en el código fuente.

Comparación en tiempo constante — compara siempre los valores HMAC usando una función de comparación en tiempo constante como hash_equals() en PHP o hmac.compare_digest() en Python. Un ataque de temporización podría revelar el HMAC correcto byte por byte.

Ataques de repetición — HMAC por sí solo no previene ataques de repetición. Incluye un timestamp o nonce en el mensaje firmado y verifícalo en el servidor.

Herramienta en Línea

El Generador de HMAC en Help2Code calcula valores HMAC con tu elección de algoritmo y clave secreta. Úsalo para probar implementaciones HMAC o generar vectores de prueba durante el desarrollo.

Conclusión

HMAC proporciona autenticación de mensajes usando un secreto compartido y una función hash criptográfica. Es esencial para la seguridad de API, verificación de webhooks y cualquier escenario donde necesites verificar tanto la integridad como la autenticidad de un mensaje. Usa HMAC-SHA256 con una clave secreta fuerte y compara siempre los valores HMAC usando funciones de tiempo constante.


About this article

Aprende cómo funciona HMAC (Código de Autenticación de Mensajes Basado en Hash), cómo se diferencia del hash simple y cómo usarlo para autenticación de API.


Related Articles


Related Tools

Help2Code Logo
Menu