Generador HMAC

Genera firmas HMAC con SHA-256, SHA-384 o SHA-512

Algoritmo

Mensaje

Se ejecuta localmente · Es seguro pegar secretos

Clave secreta

Se ejecuta localmente · Es seguro pegar secretos

Firma HMAC

La firma HMAC aparecerá aquí…

¿Qué es HMAC?

HMAC (Hash-based Message Authentication Code, código de autenticación de mensajes basado en hash) es una construcción criptográfica definida en la RFC 2104 que combina una función hash con una clave secreta para producir una etiqueta de autenticación de tamaño fijo. A diferencia de un hash simple, que cualquiera puede calcular, un HMAC solo puede generarse y verificarse por las partes que comparten la clave secreta. HMAC es el mecanismo estándar para verificar tanto la integridad como la autenticidad de un mensaje: confirma que los datos no han sido alterados y que fueron producidos por un emisor de confianza.

El algoritmo HMAC funciona con cualquier función hash iterativa: SHA-256, SHA-384, SHA-512, e incluso funciones heredadas como SHA-1 o MD5. La construcción resultante se denomina por su hash subyacente: HMAC-SHA256, HMAC-SHA384 o HMAC-SHA512. Como la prueba de seguridad de HMAC depende de que la función hash sea resistente a colisiones y tenga ciertas propiedades pseudoaleatorias, los algoritmos de la familia SHA-2 son la opción recomendada para sistemas nuevos. HMAC-SHA256 es la variante más ampliamente desplegada, usada en AWS Signature V4, webhooks de Stripe, secretos de webhook de GitHub, firma de solicitudes de Slack y JSON Web Tokens (HS256).

El diseño de HMAC proporciona una propiedad crítica que el hashing simple no tiene: resistencia a los ataques de extensión de longitud. Con SHA-256 solo, un atacante que conoce H(mensaje) puede calcular H(mensaje || datos_atacante) sin conocer el mensaje original. La estructura de doble hashing de HMAC (hash interno y hash externo con claves rellenadas diferentes) previene este ataque por completo. Por eso los esquemas de firma de API usan HMAC en lugar de simplemente concatenar una clave secreta al mensaje y hacer hash del resultado.

¿Por qué usar un generador HMAC online?

Calcular firmas HMAC normalmente requiere escribir código o usar herramientas de línea de comandos. Este generador HMAC en el navegador te permite crear firmas HMAC-SHA256, HMAC-SHA384 y HMAC-SHA512 al instante sin instalar software ni cambiar a una terminal.

Cálculo HMAC instantáneo
Introduce tu mensaje y clave secreta, selecciona el algoritmo hash y obtén la firma HMAC de inmediato. La Web Crypto API gestiona el cálculo de forma nativa en tu navegador.
🔒
Procesamiento con privacidad total
Tu mensaje y clave secreta nunca abandonan tu dispositivo. Todo el cálculo HMAC se ejecuta localmente mediante la Web Crypto API — sin peticiones al servidor, sin registros, sin retención de datos.
📋
Soporte para múltiples algoritmos
Cambia entre HMAC-SHA256, HMAC-SHA384 y HMAC-SHA512 con un clic. Compara las salidas entre algoritmos para verificar que tu implementación de backend coincide.
🔍
Sin cuenta ni instalación
Funciona en cualquier navegador moderno: Chrome, Firefox, Safari, Edge. Sin registro, sin extensión, sin configuración de CLI. Abre la página y empieza a generar firmas HMAC.

Casos de uso del generador HMAC

Desarrollador frontend — verificación de firmas de webhook
Stripe, GitHub y Shopify firman los payloads de webhook con HMAC-SHA256. Usa esta herramienta para calcular la firma esperada a partir de un payload y un secreto, y luego compárala con la firma en la cabecera HTTP durante el desarrollo.
Ingeniero backend — firma de solicitudes de API
AWS Signature V4 requiere HMAC-SHA256 en múltiples etapas del proceso de firma. Genera valores HMAC de referencia durante el desarrollo para depurar discrepancias en la firma y verificar los pasos intermedios de cálculo.
DevOps — validación de rotación de secretos
Al rotar secretos de webhook o claves de firma de API, calcula firmas HMAC con la clave antigua y la nueva para confirmar que tu aplicación gestiona correctamente la transición antes de que expire la clave antigua.
Ingeniero de QA — vectores de prueba de firma
Genera vectores de prueba HMAC con entradas y claves conocidas para construir pruebas de regresión para tu middleware de autenticación. Verifica que tu implementación gestiona correctamente mensajes vacíos, entradas Unicode y claves largas.
Ingeniero de datos — autenticación de mensajes en pipelines
Adjunta firmas HMAC a los mensajes en pipelines orientados a eventos (Kafka, SQS) para verificar que los mensajes no han sido manipulados durante el tránsito entre servicios.
Estudiante — ejercicios de criptografía
Experimenta con HMAC para entender cómo cambiar un solo carácter en el mensaje o la clave produce una firma completamente diferente. Compara la salida de HMAC con la de SHA-256 simple para observar la diferencia que introduce una clave secreta.

HMAC vs hash simple vs cifrado

HMAC, el hashing simple y el cifrado sirven para propósitos diferentes. HMAC proporciona autenticación de mensajes: prueba de que el mensaje fue creado por alguien con la clave secreta y no ha sido modificado. Un hash simple proporciona integridad pero no autenticación. El cifrado proporciona confidencialidad. La tabla a continuación aclara las diferencias.

PropiedadHMACPlain HashEncryption
PurposeMessage authentication + integrityData integrity only (no key)Confidentiality + integrity
Requires secret keyYesNoYes
Verifiable byParties who share the secretAnyoneRecipient with key
ReversibleNo — digest onlyNo — digest onlyYes — decryption recovers data
Output sizeDepends on hash (e.g. 256 bits)Depends on hashVariable (ciphertext)
StandardRFC 2104FIPS 180-4NIST SP 800-38A (AES)
Use case exampleWebhook signature verificationFile checksum verificationEncrypting data at rest

Comparación de algoritmos HMAC

HMAC puede usar cualquier función hash, pero la elección del algoritmo subyacente determina el tamaño de la salida, el nivel de seguridad y la compatibilidad con el navegador. HMAC-SHA256 es la opción más común para sistemas nuevos. La tabla compara las variantes que probablemente encuentres.

AlgoritmoTamaño del resumenLongitud hexWeb Crypto APIIdeal para
HMAC-SHA256256 bits64 hex charsYesAPI signing, webhooks, JWT (HS256)
HMAC-SHA384384 bits96 hex charsYesTLS 1.3 PRF, CNSA compliance
HMAC-SHA512512 bits128 hex charsYesHigh-security signatures, HKDF
HMAC-SHA1160 bits40 hex charsYesLegacy OAuth 1.0, TOTP (RFC 6238)
HMAC-MD5128 bits32 hex charsNoLegacy only — not recommended

Cómo funciona HMAC internamente

HMAC aplica la función hash subyacente dos veces con dos rellenos derivados de la clave. La construcción está definida en la RFC 2104 y demostrada como PRF (función pseudoaleatoria) bajo suposiciones criptográficas estándar. La clave se rellena primero o se hace hash para coincidir con el tamaño de bloque de la función hash (64 bytes para SHA-256, 128 bytes para SHA-512).

HMAC(K, m) = H((K' ⊕ opad) || H((K' ⊕ ipad) || m))
where K' = key padded to block size, ipad = 0x36, opad = 0x5C

El algoritmo aplica XOR a la clave rellenada con una constante de relleno interno (ipad, 0x36 repetido), la concatena con el mensaje y hace hash del resultado. Luego aplica XOR a la clave rellenada con una constante de relleno externo (opad, 0x5C repetido), la concatena con la salida del hash interno y hace hash de nuevo. Esta estructura de doble hashing es la que previene los ataques de extensión de longitud y garantiza que la salida HMAC no pueda calcularse sin conocer la clave secreta.

Ejemplos de código HMAC

HMAC está soportado de forma nativa en todos los principales lenguajes y entornos de ejecución. La Web Crypto API proporciona HMAC-SHA256, HMAC-SHA384 y HMAC-SHA512 en los navegadores sin ninguna biblioteca. Los ejemplos a continuación muestran patrones de uso reales, incluida la verificación de webhooks y la comparación en tiempo constante.

JavaScript (Web Crypto API)
async function hmacSHA256(message, secret) {
  const enc = new TextEncoder()
  const key = await crypto.subtle.importKey(
    'raw', enc.encode(secret),
    { name: 'HMAC', hash: 'SHA-256' },
    false, ['sign']
  )
  const sig = await crypto.subtle.sign('HMAC', key, enc.encode(message))
  return Array.from(new Uint8Array(sig))
    .map(b => b.toString(16).padStart(2, '0')).join('')
}

await hmacSHA256('hello world', 'my-secret-key')
// → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"

// Node.js (built-in crypto module)
const crypto = require('crypto')
crypto.createHmac('sha256', 'my-secret-key')
  .update('hello world').digest('hex')
// → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"
Python
import hmac
import hashlib

# HMAC-SHA256
sig = hmac.new(
    b'my-secret-key',
    b'hello world',
    hashlib.sha256
).hexdigest()
print(sig)
# → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"

# Verify a webhook signature (constant-time comparison)
expected = "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"
received = hmac.new(b'my-secret-key', b'hello world', hashlib.sha256).hexdigest()
if hmac.compare_digest(expected, received):
    print("Signature valid")

# HMAC-SHA512
hmac.new(b'key', b'data', hashlib.sha512).hexdigest()
Go
package main

import (
    "crypto/hmac"
    "crypto/sha256"
    "fmt"
)

func main() {
    mac := hmac.New(sha256.New, []byte("my-secret-key"))
    mac.Write([]byte("hello world"))
    sig := mac.Sum(nil)
    fmt.Printf("%x\n", sig)
    // → 90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad

    // Verify: use hmac.Equal for constant-time comparison
    expected := mac.Sum(nil)
    fmt.Println(hmac.Equal(sig, expected)) // true
}
CLI (OpenSSL)
# HMAC-SHA256
echo -n "hello world" | openssl dgst -sha256 -hmac "my-secret-key"
# → SHA2-256(stdin)= 90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad

# HMAC-SHA512
echo -n "hello world" | openssl dgst -sha512 -hmac "my-secret-key"

# Verify a file signature
openssl dgst -sha256 -hmac "my-secret-key" release.tar.gz

# HMAC with hex key (e.g. from a webhook secret)
echo -n "payload" | openssl dgst -sha256 -hmac "$(echo -n '736563726574' | xxd -r -p)"

Preguntas frecuentes

¿Cuál es la diferencia entre HMAC y un hash simple?
Un hash simple (SHA-256, MD5) toma solo un mensaje como entrada y produce un resumen que cualquiera puede calcular. HMAC toma tanto un mensaje como una clave secreta, produciendo una firma que solo alguien con la clave puede generar o verificar. Esto significa que HMAC proporciona autenticación (prueba de identidad del emisor) además de verificación de integridad. Un hash simple solo demuestra que los datos no han cambiado, no quién los produjo.
¿Es seguro HMAC-SHA256?
Sí. HMAC-SHA256 se considera seguro a 2026. Su seguridad depende de las propiedades pseudoaleatorias de SHA-256 y de la construcción HMAC en sí (RFC 2104). No se ha demostrado ningún ataque práctico contra HMAC-SHA256. Incluso HMAC-MD5 y HMAC-SHA1 siguen siendo seguros en la práctica porque la seguridad de HMAC no requiere resistencia total a colisiones del hash subyacente, aunque se recomiendan las variantes SHA-2 para sistemas nuevos.
¿Por qué los webhooks usan HMAC en lugar de cifrar el payload?
Los payloads de webhook suelen contener datos que el receptor ya espera: detalles de pedidos, notificaciones de eventos, actualizaciones de estado. El objetivo no es ocultar los datos (confidencialidad) sino demostrar que provienen del emisor legítimo y no fueron modificados en tránsito (autenticidad e integridad). HMAC logra esto con una sobrecarga mínima: el emisor calcula un HMAC del payload con un secreto compartido y lo incluye en una cabecera HTTP. El receptor recalcula el HMAC y compara. El cifrado añadiría complejidad innecesaria y una carga adicional de gestión de claves.
¿Cómo debo comparar firmas HMAC de forma segura?
Usa siempre una función de comparación en tiempo constante. En Python, usa hmac.compare_digest(). En Node.js, usa crypto.timingSafeEqual(). En Go, usa hmac.Equal(). Los operadores de igualdad estándar (== o ===) pueden filtrar información de temporización: un atacante puede medir cuánto tarda la comparación para determinar cuántos bytes de su firma falsificada coinciden con la correcta, y luego forzar por fuerza bruta los bytes restantes uno a uno.
¿Puede revertirse HMAC para recuperar la clave secreta?
No. HMAC se basa en una función hash unidireccional, por lo que no existe ningún atajo matemático para extraer la clave a partir de una salida HMAC. Un atacante necesitaría hacer fuerza bruta sobre el espacio de claves, lo cual es inviable para claves de 128 bits o más. Sin embargo, las claves débiles o cortas (como contraseñas simples) pueden ser vulnerables a ataques de diccionario, por lo que siempre debes usar claves criptográficamente aleatorias de al menos 256 bits para HMAC-SHA256.
¿Qué ocurre si la clave HMAC es más larga que el tamaño de bloque del hash?
Si la clave secreta es más larga que el tamaño de bloque de la función hash (64 bytes para SHA-256, 128 bytes para SHA-512), el algoritmo HMAC primero hace hash de la clave con la función hash subyacente para reducirla a la longitud de salida del hash, y luego usa ese hash como clave efectiva. Esto significa que las claves muy largas no proporcionan seguridad adicional más allá del tamaño de salida del hash. Para HMAC-SHA256, las claves de más de 64 bytes se reducen a 32 bytes y no ofrecen mejora de seguridad respecto a una clave de 64 bytes; las claves de hasta 64 bytes se usan en su longitud completa.
¿Cuándo debería usar HMAC-SHA512 en lugar de HMAC-SHA256?
Usa HMAC-SHA512 cuando el protocolo lo requiera (algunas funciones de derivación de claves como HKDF-SHA512, generación de claves Ed25519), cuando necesites una firma más amplia para defensa en profundidad, o cuando ejecutes en hardware de 64 bits donde SHA-512 es en realidad más rápido que SHA-256. Para la mayoría de las aplicaciones web, la firma de API y la verificación de webhooks, HMAC-SHA256 proporciona seguridad suficiente y es la opción más común en todos los ecosistemas.