Calcula un HMAC o comprueba el que te envió un webhook
Este generador HMAC firma un mensaje con una clave secreta usando HMAC-SHA256, HMAC-SHA1, HMAC-SHA384 o HMAC-SHA512, y muestra la firma en hex en minúsculas, hex en mayúsculas, Base64 y Base64url a la vez. La clave y el mensaje pueden escribirse como texto plano, hex o Base64, así que funciona tanto con secretos binarios como con contraseñas. Pega la firma que recibiste — <code>sha256=…</code> de GitHub, una cabecera de Stripe <code>t=…,v1=…</code> o Base64 simple — y te dirá si coincide. El cálculo usa la Web Crypto API de tu navegador; la clave y el mensaje nunca salen de la página.
Cómo generar o verificar un HMAC
- 1Elige la función hash: SHA-256 es la que usan la mayoría de las API y webhooks.
- 2Escribe o pega la clave secreta y elige cómo está escrita: texto, hex o Base64. Usa Clave aleatoria para crear un secreto nuevo de la longitud adecuada.
- 3Pega el mensaje: en un webhook, el cuerpo bruto de la petición exactamente como llegó, byte a byte.
- 4Copia la firma en la codificación que necesites. Para comprobar una firma, pégala en Firma esperada; un prefijo como
sha256=se reconoce y se ignora.
¿Qué es un HMAC?
Un HMAC (hash-based message authentication code, RFC 2104) es un valor corto calculado a partir de un mensaje y una clave secreta. Cualquiera que conozca la clave puede calcular el mismo valor y así comprobar dos cosas a la vez: que el mensaje no se modificó por el camino y que lo produjo alguien que tiene la clave. Sin la clave, un atacante no puede falsificar un HMAC válido para un mensaje nuevo ni ajustar uno después de cambiar el mensaje.
No es simplemente un hash de la clave y el mensaje concatenados. HMAC aplica el hash dos veces, mezclando la clave en un relleno interno y otro externo: H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ message)). Esa construcción es lo que lo hace seguro con SHA-256 y SHA-512, que por sí solos son vulnerables a ataques de extensión de longitud cuando se usan como H(key ‖ message).
Verificar firmas de webhooks
La mayoría de los proveedores de webhooks firman cada petición con un HMAC del cuerpo y ponen el resultado en una cabecera. Para verificarla, calcula el HMAC del cuerpo bruto con tu secreto de firma y compáralo con el valor de la cabecera. El error más común es aplicar el hash a un objeto JSON reserializado en lugar de a los bytes que llegaron: un orden de claves distinto o un espacio que falta cambia la firma por completo.
Algunos proveedores firman algo más que el cuerpo. Stripe firma timestamp.body — el valor t de la cabecera, un punto y luego el payload — y Slack firma v0:timestamp:body. Construye esa cadena exacta como mensaje aquí y pega la cabecera completa en la casilla de verificación; el valor v1= o v0= se extrae de ella.
- GitHub
- <code>X-Hub-Signature-256: sha256=<hex></code>, HMAC-SHA256 del cuerpo con el secreto del webhook como texto.
- Stripe
- <code>Stripe-Signature: t=…,v1=<hex></code>, HMAC-SHA256 de <code>t.body</code>.
- Shopify
- <code>X-Shopify-Hmac-Sha256: <Base64></code>, HMAC-SHA256 del cuerpo.
- Slack
- <code>X-Slack-Signature: v0=<hex></code>, HMAC-SHA256 de <code>v0:timestamp:body</code>.
Claves en texto, hex y Base64
Una clave es una secuencia de bytes, y cómo se escribe importa. El texto abc123 son seis bytes; el hex abc123 son tres bytes completamente distintos. Muchos servicios entregan secretos como cadenas hex o Base64 pero esperan que uses la propia cadena como clave de texto — GitHub y Stripe lo hacen — mientras que otros, como las cadenas de firma al estilo de AWS y los app proxies de Shopify, usan los bytes decodificados. Si una firma no coincide, cambiar la codificación de la clave es lo primero que conviene probar.
Para una clave nueva, usa bytes aleatorios al menos tan largos como la salida del hash: 32 bytes para HMAC-SHA256 y 64 para HMAC-SHA512. Las claves más largas no aportan nada: todo lo que supere el tamaño de bloque del hash se reduce primero con un hash.
Comparación en tiempo constante
Cuando tu servidor compruebe una firma, compárala con una función de tiempo constante como crypto.timingSafeEqual en Node.js, hmac.compare_digest en Python o hash_equals en PHP. Una comparación de cadenas normal se detiene en el primer carácter distinto, y el tiempo que tarda puede revelar cuánto de una firma falsificada era correcto. Esta página usa el mismo patrón de tiempo constante, así que el código sirve de referencia además de comprobación.
Si solo necesitas un checksum normal de un archivo o texto, sin clave, usa el generador de hash. Para firmar tokens, el generador de secretos JWT crea claves HS256 del tamaño adecuado.
Preguntas frecuentes
- ¿Qué diferencia hay entre un hash y un HMAC?
- Un hash como SHA-256 depende solo de los datos, así que cualquiera puede recalcularlo. Un HMAC depende además de una clave secreta, así que solo quien tiene la clave puede generarlo o comprobarlo. Por eso un HMAC prueba la autenticidad, no solo la integridad.
- ¿Por qué mi HMAC no coincide con el de la API?
- Casi siempre la entrada es distinta: el mensaje no es byte a byte el cuerpo bruto (JSON reserializado, un salto de línea final, finales de línea diferentes), la clave se lee como texto cuando el servicio se refiere a bytes hex o Base64 o al revés, o el proveedor firma un timestamp más el cuerpo en lugar del cuerpo solo.
- ¿Qué algoritmo HMAC debo usar?
- HMAC-SHA256 es la opción estándar y la que usan casi todas las API. HMAC-SHA512 es igual de válido y más rápido en servidores de 64 bits. HMAC-SHA1 sigue siendo seguro como HMAC, a pesar de las colisiones de SHA-1, pero úsalo solo cuando un protocolo lo exija.
- ¿Está roto HMAC-SHA1?
- No. Las colisiones de SHA-1 no permiten falsificar un HMAC-SHA1 sin la clave, y no se conoce ningún ataque práctico contra HMAC-SHA1. Está desaconsejado para diseños nuevos, pero verificar firmas HMAC-SHA1 heredadas es seguro.
- ¿Puedo calcular HMAC-MD5 aquí?
- No. La Web Crypto API del navegador, que usa esta página, no implementa MD5. HMAC-MD5 solo sobrevive en protocolos antiguos; usa HMAC-SHA256 para todo lo nuevo.
- ¿Qué longitud debe tener una clave HMAC?
- Al menos la de la salida del hash: 32 bytes aleatorios para HMAC-SHA256, 48 para SHA-384 y 64 para SHA-512. El botón Clave aleatoria genera exactamente eso con el generador de números aleatorios seguro de tu navegador.
- ¿Puedo usar una clave vacía?
- HMAC lo permite y el resultado está bien definido, así que la herramienta lo muestra, pero una clave vacía o corta no da ninguna seguridad. Cualquiera podría calcular la misma firma.
- ¿Se envía mi clave secreta a algún sitio?
- No. El HMAC lo calcula la Web Crypto API de tu navegador en esta página. Nada de lo que escribes se sube ni se guarda.