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.
¿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
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
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
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
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
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.
// Server stored a base64 secret but you sign the literal string
createHmac('sha256', 'c2VjcmV0LWtleQ==').update(msg) // 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.
// Provider sends base64, you compare hex
expected = 'Cd2f7z...=' // base64
actual = digest('hex') // hex — never matches // 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.
// Re-serialization changes the bytes body = JSON.stringify(JSON.parse(rawBody)) verify(hmac(body))
// 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.
if (received === computed) { /* trust */ } 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?
¿En qué se diferencia un HMAC de un hash simple como SHA-256?
¿Cómo verifico la firma de un webhook entrante?
¿Qué codificación de clave y de salida usa mi servidor?
¿Es seguro HMAC-SHA256?
¿Por qué no hay HMAC-MD5 ni HMAC-SHA-3 aquí?
HS256 (HMAC) vs RS256 (RSA): ¿cuál debo usar para los JWT?
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.