Skip to content

Generador HMAC y verificador de firmas

Generador y verificador HMAC en línea gratis. Calcula HMAC-SHA256/SHA1/SHA384/SHA512 con claves en texto, hex o Base64 y salida Hex/Base64/Base64URL. 100 % en tu navegador: las claves nunca salen de la página.

Sin rastreo Se ejecuta en el navegador Gratis
100 % en tu navegador: tu mensaje y tu clave secreta nunca salen de tu dispositivo.
HMAC generado

¿Qué es un HMAC?

Un HMAC (Hash-based Message Authentication Code) es una etiqueta corta de longitud fija que demuestra que un mensaje está sin modificar y es auténtico, es decir, que lo produjo alguien que posee una clave secreta compartida. Definido en la RFC 2104 y FIPS 198-1, HMAC combina cualquier función hash criptográfica con una clave secreta en una construcción anidada concreta, escrita como HMAC(K, m) = H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ m)). El hash interno vincula la clave al mensaje; el hash externo envuelve el resultado, que es lo que hace a HMAC resistente a los ataques de extensión de longitud que afectan a las funciones SHA-1 y SHA-256 puras.

HMAC está en todas partes de la infraestructura web moderna. Firma webhooks para que puedas confirmar que una solicitud entrante proviene realmente de GitHub, Stripe, Slack o Twilio y no fue falsificada. Firma solicitudes de API (AWS Signature Version 4 se basa en HMAC-SHA256) para que un servidor pueda autenticar al solicitante sin enviar una contraseña por la red. Es la S de HS256: un JWT firmado con HS256 lleva un HMAC-SHA256 sobre su cabecera y su contenido, que puedes inspeccionar con el codificador JWT. También sustenta la derivación de claves de TLS (HKDF), los algoritmos de contraseñas de un solo uso (HOTP/TOTP) y la integridad de mensajes en incontables servicios internos.

Esta herramienta calcula HMAC enteramente en tu navegador usando crypto.subtle.sign('HMAC', ...) de la API Web Crypto, la misma primitiva que los navegadores usan durante los handshakes de TLS. Tu clave secreta y tu mensaje nunca se suben, así que es seguro para secretos de firma de producción. Como el mismo secreto puede expresarse como texto plano, hex o base64, la herramienta te deja elegir explícitamente la codificación de la clave, y como distintos proveedores esperan la etiqueta en distintas formas, puedes generar la salida en Hex, Base64 o Base64URL. La pestaña Verificar te permite comprobar una firma que recibiste, usando una comparación en tiempo constante para que la propia comprobación no filtre información de temporización.

const crypto = require('crypto');

// HMAC-SHA256 with a UTF-8 text key, hex output
const hmac = crypto
  .createHmac('sha256', 'my-secret-key')
  .update('Hello, World!')
  .digest('hex');

console.log(hmac);
// → 'cf3141611e22ea26a9cac6fe41d941274dd6653622c83cba13972d177bd69699'

// Verify a signature in constant time
function verify(message, key, expectedHex) {
  const actual = crypto.createHmac('sha256', key).update(message).digest();
  const expected = Buffer.from(expectedHex, 'hex');
  return actual.length === expected.length &&
    crypto.timingSafeEqual(actual, expected);
}

Funciones clave

Generar y verificar en una sola herramienta

Genera una firma en la pestaña Generar, o pega un HMAC esperado en la pestaña Verificar para autenticar un webhook o token entrante. La verificación usa una comparación en tiempo constante, así que el resultado nunca filtra información de temporización.

Elegir la codificación de la clave

Interpreta tu secreto como Texto (UTF-8), Hexadecimal o Base64. Este es el ajuste que la mayoría de las demás herramientas omite, y la razón más común de que dos sistemas calculen HMAC distintos para la misma clave.

Tres codificaciones de salida

Genera la etiqueta como Hex (webhooks de GitHub, AWS), Base64 (Stripe, Twilio, muchas API) o Base64URL (JWT y tokens seguros para URL) para que coincida con tu integración sin conversión manual.

Cuatro algoritmos nativos

HMAC-SHA256 por defecto, además de SHA-1, SHA-384 y SHA-512. Todos se ejecutan en la API Web Crypto del navegador, así que no hay ninguna biblioteca criptográfica de JavaScript en la que confiar ni penalización de rendimiento.

100 % del lado del cliente y privado

Tu clave secreta y tu mensaje se procesan enteramente en tu navegador y nunca se envían a ningún servidor. Abre la pestaña Red y verás cero solicitudes salientes: seguro para secretos de firma de producción.

Cálculo en vivo

El HMAC se recalcula al instante mientras editas el mensaje, la clave, la codificación o el algoritmo; sin un viaje de ida y vuelta con botón Generar, para que puedas experimentar con codificaciones hasta que tu valor coincida con el del servidor.

Construido sobre vectores probados

La salida se valida frente a los vectores de prueba HMAC oficiales de la RFC 4231, así que puedes confiar en que los resúmenes coinciden con lo que producen OpenSSL, el módulo crypto de Node y la biblioteca hmac de Python.

Ejemplos de HMAC

Inicio rápido — HMAC-SHA256, salida hex

Hello, World!
cf3141611e22ea26a9cac6fe41d941274dd6653622c83cba13972d177bd69699

Con la clave «my-secret-key» (codificación de clave = Texto), el algoritmo HMAC-SHA256 y el formato de salida = Hex, el mensaje «Hello, World!» produce cf3141611e22ea26a9cac6fe41d941274dd6653622c83cba13972d177bd69699. Este es el resumen hex canónico de 64 caracteres que obtienes con crypto.createHmac('sha256', key).update(msg).digest('hex') de Node.

Verificar un webhook estilo Stripe (salida Base64)

{"id":42,"event":"user.created"}
Cd2f7zTKaJFeG6k+t1FcvDPn51OAZ2f4GrxkCUgMhGs=

Muchos proveedores de webhooks envían la firma en Base64. Con la clave «whsec_test_secret» (Texto), HMAC-SHA256 y el formato de salida = Base64, el cuerpo JSON se firma como Cd2f7zTKaJFeG6k+t1FcvDPn51OAZ2f4GrxkCUgMhGs=. Pega ese valor en la pestaña Verificar para confirmar que la solicitud proviene realmente de tu proveedor antes de procesarla. Internamente HMAC se ejecuta sobre la misma primitiva que nuestro generador de hash SHA-256, pero con clave gracias a tu secreto.

Vector de referencia RFC 4231

what do ya want for nothing?
5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843

Este es el caso de prueba 2 de la RFC 4231, el documento oficial de vectores de prueba HMAC. Con la clave «Jefe» (Texto), HMAC-SHA256 y salida Hex, el mensaje «what do ya want for nothing?» produce 5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843. Reproducir este valor exacto es cómo demuestras que una implementación HMAC es correcta.

HMAC-SHA512 para un resumen más largo

The quick brown fox
36f44b125a8a90639dc46733039571792e081e0fd8685ff746784b02ed14aa35629d562c7117cde4a701570551faa5a5e1b7ef1eb5c3bcd4cc1fdb8923fcf14e

Cambia el algoritmo a HMAC-SHA512 para un resumen de 128 caracteres (512 bits). Con la clave «key» (Texto) y salida Hex, «The quick brown fox» produce el valor anterior. SHA-512 es más rápido que SHA-256 en la mayoría del hardware de 64 bits y ofrece una salida mayor, aunque SHA-256 sigue siendo el predeterminado para la interoperabilidad.

Cómo generar y verificar un HMAC

  1. 1

    Elegir el algoritmo

    Elige HMAC-SHA256 (el predeterminado y la opción correcta para casi todos los webhooks, API y JWT), o cambia a SHA-1, SHA-384 o SHA-512 para coincidir con un sistema que lo requiera. Los cuatro se ejecutan de forma nativa en tu navegador mediante la API Web Crypto.

  2. 2

    Introducir la clave secreta y fijar su codificación

    Escribe o pega tu clave secreta, luego ajusta la codificación de clave para que coincida con cómo la interpreta el servidor: Texto (UTF-8) para una cadena normal, Hex para un bloque hexadecimal, o Base64 para un secreto en base64. Equivocarse aquí es la principal causa de desajustes de HMAC, así que ante la duda prueba las tres.

  3. 3

    Introducir el mensaje

    Pega los bytes exactos que quieres firmar: para un webhook, este es el cuerpo crudo de la solicitud, byte a byte, sin reserialización ni cambios de espacios. El HMAC se recalcula en vivo mientras editas, sin enviar nada a un servidor.

  4. 4

    Elegir el formato de salida y copiar

    Selecciona Hex (estilo GitHub), Base64 (estilo Stripe/AWS) o Base64URL (estilo JWT) para coincidir con lo que espera tu integración, luego haz clic en Copiar para obtener la firma.

  5. 5

    Verificar una firma existente

    Cambia a la pestaña Verificar, pega el HMAC esperado de una cabecera o token, y la herramienta confirma en tiempo constante si tu firma calculada coincide, para que puedas autenticar un contenido antes de actuar sobre él.

Errores comunes de HMAC

Codificación de clave equivocada (la causa n.º 1 de desajustes)

El mismo secreto puede leerse como texto UTF-8 crudo, como hex o como base64, y cada interpretación produce bytes de clave completamente distintos, así que el HMAC no coincidirá si tu herramienta y el servidor no están de acuerdo. Si un proveedor te da un secreto en hex o base64, debes decodificarlo a bytes antes de firmar, no firmar la cadena tal cual. Cuando una firma no se verifica, prueba primero la clave con las tres opciones de codificación de clave.

✗ Incorrecto
// Server stored a base64 secret but you sign the literal string
createHmac('sha256', 'c2VjcmV0LWtleQ==').update(msg)
✓ Correcto
// Decode the base64 secret to raw bytes first
createHmac('sha256', Buffer.from('c2VjcmV0LWtleQ==', 'base64')).update(msg)

Codificación de salida equivocada

Un HMAC son bytes crudos; hex, base64 y base64url son solo codificaciones de texto distintas del mismo valor. Si el servidor envía una firma en base64 y la comparas con tu resumen hex, nunca coincidirán aunque los bytes subyacentes sean idénticos. Haz que el formato de salida coincida con lo que usa la cabecera o el token.

✗ Incorrecto
// Provider sends base64, you compare hex
expected = 'Cd2f7z...=' // base64
actual   = digest('hex') // hex — never matches
✓ Correcto
// Produce the same encoding the provider uses
actual = digest('base64')

Firmar JSON reserializado en lugar del cuerpo crudo

Las firmas de webhook cubren los bytes exactos que envió el proveedor. Si analizas el JSON y lo vuelves a convertir en cadena, el orden de las claves, el espaciado y el formato de los números pueden cambiar, alterando los bytes y rompiendo la firma. Calcula siempre el HMAC sobre el cuerpo crudo de la solicitud capturado antes de cualquier análisis.

✗ Incorrecto
// Re-serialization changes the bytes
body = JSON.stringify(JSON.parse(rawBody))
verify(hmac(body))
✓ Correcto
// Sign the raw bytes exactly as received
verify(hmac(rawBody))

Usar == en lugar de una comparación en tiempo constante

Comparar la firma recibida con == o una simple igualdad de cadenas filtra información de temporización, porque la comparación se detiene en el primer byte distinto. A lo largo de muchos intentos un atacante puede recuperar una etiqueta válida. Usa siempre una comprobación de igualdad en tiempo constante al verificar.

✗ Incorrecto
if (received === computed) { /* trust */ }
✓ Correcto
if (crypto.timingSafeEqual(receivedBuf, computedBuf)) { /* trust */ }

Para qué se usa HMAC

Verificar firmas de webhook
Proveedores como GitHub, Stripe, Slack y Twilio firman cada webhook con un HMAC sobre el cuerpo de la solicitud y un secreto que solo tú compartes. Recalcula la etiqueta y compárala con la cabecera (por ejemplo X-Hub-Signature-256) para confirmar que el evento es genuino antes de actuar sobre él. Usa la pestaña Verificar para hacerlo sin escribir código desechable.
Firmar solicitudes de API
Las API autenticadas suelen exigir que el cliente firme la solicitud con HMAC (método, ruta, marca de tiempo, cuerpo) usando un secreto compartido en lugar de enviar el secreto mismo. AWS Signature Version 4 es el ejemplo canónico. Esta herramienta te permite reproducir y depurar esas firmas paso a paso.
Garantizar la integridad de los mensajes
Cuando pasas un token, una cookie o un mensaje entre servicios, adjuntar un HMAC permite al receptor detectar cualquier manipulación. Como la etiqueta depende de un secreto, un atacante no puede recalcularla tras modificar los datos, a diferencia de una simple suma de comprobación.
Entender la firma HS256 de los JWT
Un JWT firmado con HS256 es simplemente base64url(cabecera) + '.' + base64url(contenido), firmado con HMAC-SHA256 y con el resultado emitido como Base64URL. Ajusta el algoritmo a SHA-256 y la salida a Base64URL aquí para ver exactamente cómo se produce esa firma, y luego compruébalo en el codificador JWT.
Depurar una firma que no coincide
Cuando tu HMAC no coincide con el del servidor, esta herramienta es la forma más rápida de aislar por qué: prueba la clave como Texto, Hex y Base64, cambia la salida entre Hex y Base64, y confirma que estás firmando exactamente los bytes crudos, todo sin volver a desplegar código.

Cómo funciona HMAC

Construcción de la RFC 2104
HMAC se define como H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ m)), donde ipad es el byte 0x36 repetido y opad es 0x5c repetido, ambos hasta el tamaño de bloque del hash. Una clave más larga que el tamaño de bloque se hashea primero; una clave más corta se rellena con ceros. Esta anidación de dos pasadas es lo que le da a HMAC su prueba de seguridad, que se mantiene incluso si el hash subyacente no es resistente a colisiones.
Por qué un hash con clave supera a un hash simple
Un hash simple solo prueba que los datos no se corrompieron accidentalmente, porque cualquiera puede recalcularlo para cualquier mensaje, incluido uno manipulado. HMAC mezcla un secreto, de modo que solo quienes poseen la clave pueden producir una etiqueta válida. Eso convierte la mera integridad en integridad más autenticidad, que es la propiedad que realmente necesitan los webhooks y las solicitudes firmadas.
Resistencia a la extensión de longitud
SHA-1, SHA-256 y SHA-512 puros son hashes Merkle–Damgård vulnerables a la extensión de longitud: dado H(secreto ‖ msg), un atacante puede calcular H(secreto ‖ msg ‖ extra) sin conocer el secreto. Los esquemas ingenuos de «MAC con prefijo secreto» quedan rotos por esto. El hash externo de HMAC neutraliza el ataque, que es la principal razón para usar HMAC en lugar de hashear juntos un secreto y un mensaje.
Elegir SHA-256 frente a SHA-512
HMAC-SHA256 produce una etiqueta de 256 bits (64 caracteres hex) y es el predeterminado para la interoperabilidad: rápido, omnipresente y compatible en todas partes. HMAC-SHA512 produce una etiqueta de 512 bits (128 caracteres hex) y suele ser más rápido en CPU de 64 bits porque SHA-512 usa palabras de 64 bits. Elige SHA-256 a menos que una especificación o un sistema par requiera SHA-512; ambos son seguros para la autenticación.
Implementación con Web Crypto
Esta herramienta llama a crypto.subtle.importKey para cargar tu clave (decodificada desde Texto, Hex o Base64) y a crypto.subtle.sign('HMAC', ...) para calcular la etiqueta, luego codifica los bytes crudos como Hex, Base64 o Base64URL. Es la misma implementación nativa y auditada que el navegador usa para TLS, ejecutándose fuera del motor de JavaScript para mayor rapidez.

Buenas prácticas de HMAC

Usar una clave al menos tan larga como la salida del hash
Para HMAC-SHA256 usa un secreto de al menos 32 bytes aleatorios (256 bits); para SHA-512 usa 64. Una clave corta o de baja entropía es el eslabón más débil. Genera las claves desde una fuente aleatoria criptográficamente segura, nunca una contraseña o una cadena predecible.
Comparar siempre las etiquetas en tiempo constante
Verifica las firmas con una comparación en tiempo constante (crypto.timingSafeEqual en Node, hmac.compare_digest en Python) en lugar de == o igualdad de cadenas. Una comparación ingenua termina pronto en el primer byte distinto, filtrando una temporización que puede permitir a un atacante recuperar una etiqueta válida byte a byte. La pestaña Verificar de esta herramienta ya compara en tiempo constante.
Nunca registrar ni exponer la clave secreta
Mantén los secretos de firma fuera de los registros, los mensajes de error, las URL y el código del lado del cliente. Guárdalos en un gestor de secretos o en variables de entorno, rótalos periódicamente, y limita cada integración a su propia clave para que una sola filtración no comprometa todo.
Preferir HMAC-SHA256 o más fuerte
Usa por defecto HMAC-SHA256; sube a SHA-384 o SHA-512 cuando un par lo requiera. Evita HMAC-SHA1 para sistemas nuevos y nunca uses HMAC-MD5. Aunque HMAC tolera mejor un hash más débil que una firma cruda, partir de un hash moderno te da el mayor margen.
Firmar los bytes exactos, incluida una marca de tiempo
Firma el contenido crudo y sin modificar: reserializar el JSON o recortar espacios cambia los bytes y rompe la verificación. Para la firma de solicitudes, incluye una marca de tiempo o un nonce en los datos firmados y rechaza las firmas caducadas para prevenir ataques de repetición.

Preguntas frecuentes sobre HMAC

¿Qué es HMAC?
HMAC (Hash-based Message Authentication Code) es una forma de probar tanto la integridad como la autenticidad de un mensaje usando una clave secreta compartida. Pasas un mensaje y una clave secreta por una función hash (aquí SHA-1, SHA-256, SHA-384 o SHA-512) según la construcción anidada concreta definida por la RFC 2104, y obtienes una etiqueta de longitud fija. Cualquiera que conozca el secreto puede recalcular la etiqueta y confirmar que el mensaje no se alteró y proviene de alguien que posee la clave. Es el mecanismo estándar detrás de las firmas de webhook, las solicitudes de API firmadas y la familia HS256 de tokens JWT.
¿En qué se diferencia un HMAC de un hash simple como SHA-256?
Un hash simple como SHA-256 solo prueba la integridad: cualquiera puede recalcularlo, así que cualquiera también puede falsificar un hash coincidente para un mensaje manipulado. HMAC mezcla una clave secreta, de modo que solo las partes que poseen esa clave pueden producir o verificar una etiqueta válida, lo que añade autenticidad sobre la integridad. HMAC además usa una construcción anidada de dos pasadas (hash interno y externo con pads derivados de la clave) que lo hace inmune a los ataques de extensión de longitud que afectan a SHA-1 y SHA-256 puros. En resumen: usa un hash para detectar corrupción accidental, usa un HMAC para detectar manipulación deliberada por un atacante que no conoce tu clave.
¿Cómo verifico la firma de un webhook entrante?
Toma el cuerpo crudo de la solicitud exactamente como se recibió (no vuelvas a serializar el JSON: incluso reordenar las claves rompe la firma), selecciona el mismo algoritmo que usa tu proveedor (normalmente HMAC-SHA256), introduce tu secreto de firma con la codificación de clave correcta, y ajusta el formato de salida para que coincida con la cabecera (Hex para el prefijo sha256= de GitHub, Base64 para cabeceras estilo Stripe/Twilio). Después abre la pestaña Verificar, pega la firma de la cabecera (como X-Hub-Signature-256), y la herramienta informa si coincide o no mediante una comparación en tiempo constante. Confía en el contenido solo si coincide.
¿Qué codificación de clave y de salida usa mi servidor?
No hay una respuesta universal: depende de tu proveedor, que es precisamente por lo que esta herramienta expone ambas como opciones explícitas. Patrones comunes: GitHub usa un secreto de texto UTF-8 y salida hex en minúsculas con un prefijo sha256=; Stripe usa un secreto de texto y base64; AWS Signature V4 usa claves binarias derivadas y hex; muchos sistemas internos reparten secretos en base64 o hex que deben decodificarse a bytes crudos antes de firmar. Si tu HMAC no coincide, la codificación casi siempre es la culpable: prueba la misma clave en Texto, Hex y Base64 para encontrar la interpretación que espera el servidor.
¿Es seguro HMAC-SHA256?
Sí. HMAC-SHA256 se considera ampliamente seguro y es el predeterminado recomendado para la autenticación de mensajes. Su seguridad proviene de la construcción HMAC junto con un hash subyacente sólido, y sigue siendo seguro aunque existan ataques de colisión contra el hash desnudo: HMAC no depende de la resistencia a colisiones como sí lo hace una firma digital. Los riesgos del mundo real son operativos, no algorítmicos: una clave secreta débil o filtrada, registrar la clave, o usar una comparación que no es en tiempo constante. Usa una clave aleatoria larga y compara las etiquetas en tiempo constante, y HMAC-SHA256 aguantará.
¿Por qué no hay HMAC-MD5 ni HMAC-SHA-3 aquí?
Es intencionado. Esta herramienta expone solo SHA-1, SHA-256, SHA-384 y SHA-512 porque son las funciones hash que admite la API Web Crypto nativa del navegador, lo que mantiene todo rápido y completamente del lado del cliente, sin bibliotecas adicionales. HMAC-MD5 se omite porque MD5 es obsoleto y no deberías iniciar sistemas nuevos con él. HMAC-SHA-3 se omite porque Web Crypto no implementa SHA-3; añadirlo requeriría incluir un polyfill de JavaScript. Para prácticamente todos los casos de uso modernos, HMAC-SHA256 es de todos modos la opción correcta.
HS256 (HMAC) vs RS256 (RSA): ¿cuál debo usar para los JWT?
HS256 firma y verifica un JWT con un único secreto compartido mediante HMAC-SHA256, mientras que RS256 firma con una clave privada RSA y verifica con la clave pública correspondiente. Usa HS256 cuando una sola parte emite y valida los tokens (un monolito, o servicios internos de confianza que pueden compartir el secreto con seguridad): es más simple y rápido. Usa RS256 cuando terceros o muchos servicios deben verificar los tokens pero no deben poder emitirlos, ya que puedes distribuir solo la clave pública. Puedes explorar la estructura codificada de ambos en el codificador JWT; la firma HS256 es exactamente un HMAC-SHA256 sobre la cabecera y el contenido.

Herramientas relacionadas

Ver todas las herramientas →

Generador y verificador de hash bcrypt

Herramientas de Seguridad

Genera y verifica hashes bcrypt de contraseñas online — coste ajustable, prefijos $2b$/$2a$/$2y$. 100 % en tu navegador; tu contraseña nunca se sube.

Decodificador JWT

Herramientas de Seguridad

Decodifica tokens JWT online con nuestro decodificador JWT gratis. Inspecciona encabezado, carga útil, firma, expiración y reclamaciones al instante. 100% navegador — tu token nunca sale del dispositivo. Sin registro ni rastreo.

Codificador y Generador JWT

Herramientas de Seguridad

Generador y codificador JWT gratis online. Construye el encabezado y la carga útil, firma con HS256, RS256 o ES256 al instante. 100% en el navegador — tu secreto y tu clave nunca salen de tu dispositivo.

Generador de secreto JWT — HS256/384/512

Herramientas de Seguridad

Genera un secreto JWT fuerte y conforme a la RFC para HS256/384/512 — 100 % en tu navegador, nunca enviado a un servidor. base64url, base64 o hex para .env.

Generador de Hash MD5 Online y Verificador de Checksum

Herramientas de Seguridad

Genera hashes MD5, SHA-256, SHA-1 y SHA-512 gratis — 100% en tu navegador, sin registro. Hashea texto o archivos, verifica checksums y compara hashes con un clic. Tus datos permanecen privados.

Generador de Contraseñas Aleatorias y Seguras

Herramientas de Seguridad

Genera contraseñas seguras al instante — gratis, sin registro, 100% en tu navegador. Personaliza la longitud y los tipos de caracteres, genera hasta 50 contraseñas. Medidor de fortaleza con análisis de entropía.