Generador HMAC
Calcula un HMAC-SHA1, SHA-256, SHA-384 o SHA-512 con una clave en texto, hex o Base64, obtén la salida en hex y Base64 y verifica firmas de webhook.
El mensaje se firma exactamente como está escrito, codificado en UTF-8, incluidos los espacios y los saltos de línea.
- HMAC (hex)
- HMAC (Base64)
- Cabecera de firma de webhook (estilo GitHub)
La comparación se hace en tiempo constante, como debería hacerla un servidor, para que el tiempo empleado no revele cuántos caracteres coinciden.
Cómo calcular un HMAC
- Pega el Mensaje. En el caso de un webhook, debe ser el cuerpo de la petición sin procesar, byte a byte.
- Introduce la Clave secreta y elige su Formato de la clave: Texto (UTF-8), Hexadecimal o Base64.
- Elige el Algoritmo: HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 o HMAC-SHA512.
- El resultado se actualiza mientras escribes; también puedes hacer clic en Generar HMAC. Obtienes el HMAC (hex), el HMAC (Base64) y una Cabecera de firma de webhook (estilo GitHub), cada uno con su botón Copiar.
- Para comprobar una firma que has recibido, pégala en Comparar con una firma esperada (hex, Base64 o sha256=…). La herramienta te dice si coincide.
El mensaje se codifica en UTF-8 exactamente como está escrito, incluidos los espacios y los saltos de línea. El cálculo usa la API Web Crypto de tu navegador; el mensaje y la clave nunca salen de tu dispositivo.
Qué es un HMAC
Un HMAC (código de autenticación de mensajes basado en hash, RFC 2104) combina una clave secreta con una función hash:
HMAC(K, m) = H((K′ ⊕ opad) ‖ H((K′ ⊕ ipad) ‖ m))
donde K′ es la clave rellenada hasta el tamaño de bloque del hash (se le aplica antes el hash si es más larga), e ipad/opad son constantes fijas. Solo quien conoce la clave puede generar el código correcto para un mensaje, y cualquier cambio en el mensaje cambia el código por completo. Por eso los HMAC firman webhooks, peticiones de API (por ejemplo AWS Signature Version 4) y los JSON Web Tokens HS256.
Un HMAC no es un cifrado: el mensaje no queda oculto. Tampoco es un hash de contraseñas; para guardar contraseñas, usa una función lenta como bcrypt o Argon2.
La longitud de la salida depende del algoritmo: 20 bytes para SHA-1, 32 para SHA-256, 48 para SHA-384 y 64 para SHA-512. HMAC-SHA1 se sigue considerando seguro como MAC, pero es preferible SHA-256 en sistemas nuevos. Se recomienda una clave aleatoria al menos tan larga como la salida (32 bytes para HMAC-SHA256); las claves en hex o Base64 permiten introducir directamente esos bytes aleatorios.
Verificar un webhook de GitHub
GitHub firma cada envío con el secreto de tu webhook y manda el resultado en la cabecera X-Hub-Signature-256 como sha256= seguido del HMAC-SHA256 del cuerpo en hex. El ejemplo de la propia documentación de GitHub usa el secreto It's a Secret to Everybody y el cuerpo Hello, World!; introdúcelos aquí con HMAC-SHA256 y la cabecera muestra:
X-Hub-Signature-256: sha256=757107ea0eb2509fc211221cce984b8a37570b6d7586c22c46f4379c8b043e17
El campo de comparación acepta la línea de cabecera completa, el valor sha256=… o una firma en hex o Base64 sin más (Stripe, Shopify y Slack usan esquemas parecidos, con sus propias cabeceras y cadenas firmadas). Para SHA-384 y SHA-512, la herramienta muestra una cabecera genérica X-Signature, ya que no existe un estándar común.
Comparación en tiempo constante
Un servidor que compara firmas con una comparación de cadenas normal se detiene en el primer carácter distinto. Midiendo los tiempos de respuesta, un atacante podría adivinar una firma válida carácter a carácter. La comparación de esta herramienta examina todos los bytes sea cual sea el resultado, como debería hacer un servidor con crypto.timingSafeEqual en Node.js, hmac.compare_digest en Python o hash_equals en PHP.
Preguntas frecuentes
¿Por qué mi HMAC es distinto del que calcula mi servidor?
Las causas habituales son un mensaje distinto (el servidor firma el cuerpo sin procesar y tú has pegado un JSON reformateado, o los saltos de línea no coinciden), una clave con el Formato de la clave equivocado u otro algoritmo. Un solo espacio de más cambia todo el resultado.
¿La salida debe ir en hex o en Base64?
Los dos codifican los mismos bytes. GitHub usa hex, mientras que muchas otras API, como Shopify, usan Base64. Usa el formato que espere el sistema receptor.
¿Puedo usar una clave vacía?
La herramienta la acepta y te avisa: con una clave vacía, cualquiera puede calcular el mismo HMAC, así que no demuestra nada.
¿Está roto HMAC-SHA1 igual que SHA-1?
Los ataques de colisión contra SHA-1 no rompen HMAC-SHA1, que se sigue considerando seguro como MAC. Se mantiene para sistemas heredados, como la antigua cabecera X-Hub-Signature, pero los sistemas nuevos deberían usar HMAC-SHA256 o superior.
¿Está segura aquí mi clave secreta?
La clave y el mensaje se procesan solo en tu navegador y nunca se envían a ningún sitio. Aun así, trata con cuidado un secreto de producción y cámbialo si crees que ha quedado expuesto.
Herramientas relacionadas
- Generador de hash Genera hashes MD5, SHA-1, SHA-256 y SHA-512 de textos o de archivos de cualquier tamaño y verifica sumas de comprobación. Todo en tu navegador.
- Decodificador JWT Decodifica la cabecera y la carga útil de un JWT, lee exp, iat y nbf como fechas y verifica firmas HS256, RS256, ES256 o EdDSA en tu navegador.
- Codificador y decodificador Base64 Codificador y decodificador Base64 gratuito, compatible con UTF-8 y con opción base64url apta para URL. Funciona en tu navegador, no se sube nada.
- Generador y verificador bcrypt Genera un hash bcrypt con un factor de coste de 4 a 14, comprueba una contraseña con un hash existente y consulta su versión, coste, sal y resumen.