CodeKitHub
Herramientas de codificación

Generador de HMAC

Última actualización:

Esta herramienta calcula un HMAC (Hash-based Message Authentication Code) a partir de una clave secreta y un mensaje, usando SHA-1, SHA-256, SHA-384 o SHA-512 como función hash subyacente. A diferencia de un hash simple, un HMAC exige una clave secreta compartida, así que demuestra que el mensaje procede de quien posee esa clave y que no fue alterado durante el envío — por eso las API usan HMAC para firmar solicitudes y los webhooks lo usan para verificar quién envía cada carga útil. Todo se ejecuta localmente mediante la API Web Crypto integrada en tu navegador; tu clave secreta y tu mensaje nunca se envían a ningún servidor.

HMAC-SHA1
HMAC-SHA256
HMAC-SHA384
HMAC-SHA512

¿Qué es esta herramienta?

HMAC son las siglas de Hash-based Message Authentication Code. Combina una clave secreta con un mensaje y una función hash estándar (como SHA-256) para producir un resumen de longitud fija. Cualquiera que tenga la misma clave y el mismo mensaje obtendrá exactamente el mismo HMAC — pero sin la clave, es computacionalmente inviable producir un HMAC válido para un mensaje, aunque se conozca el algoritmo hash utilizado.

Esa es la diferencia clave frente a un hash simple: un hash simple (MD5, SHA-256, etc.) solo toma el mensaje como entrada, así que cualquiera puede calcularlo y no demuestra nada sobre quién lo creó. Un HMAC toma el mensaje *y* una clave secreta, de modo que un HMAC válido demuestra que el emisor poseía el secreto — es un mecanismo de autenticación, no solo una comprobación de integridad.

El HMAC está formalmente estandarizado por el NIST en FIPS 198-1 y definido para protocolos de internet en IETF RFC 2104. Esta herramienta calcula los HMAC usando la API Web Crypto nativa de tu navegador (`crypto.subtle.sign` con el algoritmo HMAC), que implementa correctamente RFC 2104 en lugar de una versión hecha a mano en JavaScript.

¿Por qué utilizarlo?

  • Estás integrando el webhook de Stripe y el endpoint devuelve "signature verification failed" — pegas la misma clave y el mismo payload aquí para ver si tu servidor está calculando el HMAC-SHA256 correctamente antes de seguir depurando código.
  • Acabas de escribir la función que firma solicitudes salientes a una API de terceros y quieres comparar su salida contra un cálculo independiente antes de darla por buena.
  • Un compañero te pasó un secreto compartido para probar una integración y necesitas generar la firma de una petición de prueba sin instalar ninguna librería ni escribir un script solo para esto.
  • Estás documentando cómo firmar peticiones a tu propia API interna y necesitas un ejemplo reproducible con clave, mensaje y HMAC resultante para incluir en la guía del equipo.
  • Sospechas que tu backend está usando SHA-1 en vez de SHA-256 en la firma de un token y quieres comparar ambos resultados lado a lado para confirmar cuál coincide con el que recibes.

Cómo utilizarlo

  1. Introduce tu clave secreta en el campo «Clave secreta».
  2. Introduce el mensaje que quieres autenticar en el campo «Mensaje».
  3. Los resultados HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 y HMAC-SHA512 se generan al instante (marca «Salida en mayúsculas» si el sistema de destino espera letras mayúsculas).
  4. Haz clic en «Copiar» junto al HMAC que necesites.

Ejemplo

Entrada

Clave secreta: key
Mensaje: The quick brown fox jumps over the lazy dog

Resultado

HMAC-SHA256: f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8
HMAC-SHA1: de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9

Este es un vector de prueba estándar publicado: con la clave «key» y este mensaje exacto, HMAC-SHA256 y HMAC-SHA1 siempre producen estos valores en cualquier implementación correcta, así que puedes verificar el resultado de esta herramienta de forma independiente.

HMAC frente a un hash simple: cuándo necesitas una clave

La pregunta clave es: ¿necesitas demostrar quién creó este resumen, o solo que el contenido no ha cambiado? Si basta con un checksum público —comprobar que un archivo descargado coincide con lo que indicó el editor, deduplicar registros—, un hash simple funciona y cualquiera puede verificarlo, sin necesidad de clave. Si necesitas demostrar que el resumen solo pudo haberlo producido alguien que posee un secreto concreto —autenticar a quien llama a una API, confiar en el emisor de un webhook—, necesitas HMAC, porque un hash simple le daría a un atacante sin ningún secreto la misma capacidad de falsificar un resumen válido que al emisor real.

Generador de hash multialgoritmo · Decodificador de JWT · Generador de MD5

Comparación de los cuatro algoritmos HMAC

Los cuatro usan la misma construcción HMAC del RFC 2104, y solo se diferencian en la función hash subyacente y, por tanto, en la longitud de la salida.

AlgoritmoTamaño de salidaUso habitual
HMAC-SHA1160 bits (40 caracteres hexadecimales)API heredadas, firmas antiguas de OAuth 1.0a
HMAC-SHA256256 bits (64 caracteres hexadecimales)Firma de solicitudes de API, JWT HS256, verificación de webhooks
HMAC-SHA384384 bits (96 caracteres hexadecimales)Firmas de mayor confianza donde se requiere una salida más larga
HMAC-SHA512512 bits (128 caracteres hexadecimales)Resúmenes de longitud máxima para aplicaciones de alta seguridad

Casos de uso habituales

  • Firmar solicitudes de API salientes con un secreto compartido para que el servidor pueda verificar la identidad de quien llama.
  • Verificar cargas útiles de webhooks entrantes (las cabeceras Stripe-Signature, X-Hub-Signature-256 de GitHub y similares usan todas HMAC-SHA256).
  • Generar y validar la parte de firma de un JWT firmado con HS256/HS384/HS512.
  • Comprobar que tu implementación de HMAC en el servidor o en el cliente coincide con el resultado esperado antes de ponerla en producción.

Errores comunes al depurar una firma HMAC que no coincide

  • Firmar el JSON reformateado por tu framework en vez del cuerpo raw exacto de la petición — la mayoría de proveedores de webhooks (Stripe incluido) exigen firmar los bytes exactos recibidos antes de cualquier parseo, porque incluso un espacio de más cambia el HMAC resultante.
  • Usar una codificación de texto distinta a UTF-8 en un extremo de la integración — casi todas las librerías modernas asumen UTF-8 por defecto, pero un sistema heredado en Latin-1 producirá un HMAC distinto para el mismo texto visible.
  • Comparar la salida en hexadecimal minúscula con un valor esperado en mayúsculas (o en Base64 en vez de hexadecimal) — el valor criptográfico es el mismo, pero una comparación de cadenas literal fallará si los formatos no coinciden exactamente.
  • Olvidar un salto de línea final que tu editor de texto añade automáticamente al pegar la clave o el mensaje — invisible al ojo, pero cambia completamente el HMAC calculado.

Preguntas frecuentes

¿Qué es HMAC?

HMAC (Hash-based Message Authentication Code) combina una clave secreta con un mensaje mediante una función hash para producir un resumen que demuestra tanto la integridad del mensaje como que el emisor posee la clave. Está definido en el FIPS 198-1 del NIST y en el RFC 2104 del IETF.

¿Cuál es la diferencia entre HMAC y un hash simple?

Un hash simple (SHA-256, MD5, etc.) solo toma un mensaje como entrada — cualquiera puede calcularlo, así que solo demuestra que el mensaje no se corrompió, no quién lo envió. Un HMAC toma un mensaje más una clave secreta: si necesitas demostrar que un mensaje procede de alguien que posee un secreto concreto (una firma de API, el emisor de un webhook), necesitas HMAC. Si solo necesitas comprobar que un archivo o mensaje no ha cambiado y no te importa demostrar la autoría, un hash simple basta.

¿Se envía mi clave secreta a un servidor?

No. Esta herramienta calcula el HMAC íntegramente en tu navegador usando la API Web Crypto. Tu clave y tu mensaje nunca se transmiten a ningún sitio — puedes probar con total seguridad secretos reales de producción.

¿Qué algoritmo debería usar: SHA-1, SHA-256, SHA-384 o SHA-512?

Usa HMAC-SHA256 salvo que un sistema concreto exija otra cosa — es el estándar de facto para firmar API (lo usan AWS, Stripe, los webhooks de GitHub y la mayoría de API modernas) y ofrece un margen de seguridad sólido. HMAC-SHA1 sigue siendo habitual en sistemas heredados (como implementaciones antiguas de OAuth 1.0a), pero el hash subyacente de SHA-1 se considera más débil; HMAC-SHA384/512 se usan cuando se requiere específicamente una salida más larga o un margen de seguridad adicional.

¿Es inseguro HMAC-SHA1, ya que el SHA-1 simple está roto?

Los ataques de colisión de 2017 rompieron SHA-1 como función hash simple, pero HMAC-SHA1 sigue considerándose criptográficamente sólido, porque la seguridad de HMAC no depende de la resistencia a colisiones de la misma manera. Aun así, para sistemas nuevos es preferible usar HMAC-SHA256 o superior — no supone ninguna desventaja práctica y evita por completo la cuestión.

¿Cuáles son los usos habituales de HMAC en el mundo real?

Firmar solicitudes de API REST para que un servidor pueda verificar que quien llama posee el secreto de API compartido; verificar cargas útiles de webhooks de servicios como Stripe, GitHub y Shopify para saber que una solicitud procede realmente de ellos y no ha sido falsificada; generar contraseñas de un solo uso basadas en tiempo (TOTP/HOTP) para la autenticación en dos pasos; y firmar tokens JWT con los algoritmos HS256/HS384/HS512.

¿Por qué mi HMAC calculado aquí no coincide con el que genera mi servidor?

Las causas más comunes son: espacios en blanco o saltos de línea invisibles al final de la clave o el mensaje, una codificación de caracteres distinta (UTF-8 frente a Latin-1) al construir el mensaje, o firmar el cuerpo de la solicitud ya parseado en JSON en vez del cuerpo en bruto exacto que se envió por la red — muchos webhooks exigen firmar el payload raw, no una versión reformateada.

¿Puedo usar una clave secreta con caracteres especiales o Unicode?

Sí, la herramienta acepta cualquier texto en el campo de clave secreta. Ten en cuenta que si tu clave contiene caracteres no ASCII, la codificación de bytes exacta debe coincidir entre esta herramienta y tu sistema de destino para que los resultados sean idénticos — ambos usan UTF-8 internamente, que es el estándar de facto.

¿Qué diferencia hay entre esta herramienta y firmar un JWT?

Un JWT firmado con HS256 usa HMAC-SHA256 internamente sobre el encabezado y la carga codificados en Base64URL, unidos por un punto — así que esta herramienta puede ayudarte a verificar manualmente la parte de firma de un JWT, pero no genera ni decodifica el token completo. Para eso, usa nuestro Decodificador de JWT enlazado más abajo.

¿Puedo generar un HMAC de un archivo, no solo de texto?

No directamente — el campo de mensaje de esta herramienta acepta texto, no archivos binarios. Para verificar la firma de un archivo grande necesitarías una herramienta de línea de comandos como openssl que pueda procesar el contenido binario del archivo como mensaje de entrada.

Herramientas relacionadas