Subir un archivo
  1. base64hub
  2. Claves y hashes
  3. Generador HMAC

Generador HMAC (Base64)

Introduce el mensaje y la clave secreta para obtener la firma HMAC en Base64, Base64URL y hex. Sirve para depurar firmas de webhooks y la firma de peticiones a API sin enviar el secreto a ninguna parte.

Gratis sin registro, sin límites Local no se sube nada Clave como bytes de texto, hex o Base64 Actualizado 27 oct 2026

Se procesa en tu navegador. Esta página no puede enviar tus datos a ninguna parte – cómo lo sabemos

Cómo calcular un HMAC en Base64

  1. El modo HMAC y SHA-256 vienen seleccionados. Elige otro en Algoritmo si tu API usa SHA-1, SHA-384, SHA-512 o MD5.
  2. Introduce la Clave secreta y ajusta La clave es: Texto (UTF-8) para una cadena secreta normal, Hex o Base64 si la clave viene como bytes codificados.
  3. Escribe o pega el mensaje en Texto, o cambia Entrada a Archivo y suelta el archivo exacto de la carga útil.
  4. Copia la firma en Base64, Base64URL o hex. Todos los algoritmos muestra a la vez el HMAC con cada hash, algo útil cuando la documentación no deja claro cuál se usa.

Se acepta una clave vacía, que también da un resultado, con un aviso de que un HMAC así no protege nada.

Valores de ejemplo

Con la clave key y el mensaje The quick brown fox jumps over the lazy dog:

AlgoritmoHMAC en Base64
HMAC-MD5gAcHE0Y+d0m5DC3CSRHidQ==
HMAC-SHA13nybhbi3iqa8ino29wqQcBydtNk=
HMAC-SHA25697yD9DBThCSxMpjmqm+xQ+9NWaFJRhdZl0edvC0aPNg=
HMAC-SHA512tCrwkFe6weLUFwjkipAuCbX/fxKrQopP6GZTxz3SSPuC+UilSfe3kaW0GRXuTR7Dk1NX5OIxclDQNyr6Lr7rOg==

El valor HMAC-SHA256 en hex es f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8, el conocido vector de prueba del artículo de Wikipedia sobre HMAC. La codificación de la clave cambia el resultado: el texto a2V5 usado como clave da 5O+7AtpguFrgIRw1qXGU+m0OaTs1oV1kwRQ/hI1WAUE=, mientras que a2V5 leído como Base64 son los bytes de key y vuelve a dar 97yD9DBT….

Firmas de webhooks: Base64 o hex

Los proveedores coinciden en HMAC, pero no en la codificación de la salida ni en qué se firma. Algunos ejemplos bien documentados:

ProveedorCabeceraAlgoritmoCodificaciónContenido firmado
ShopifyX-Shopify-Hmac-Sha256HMAC-SHA256Base64cuerpo de la petición en bruto
Standard Webhooks (Svix)webhook-signature: v1,…HMAC-SHA256Base64id.timestamp.body, clave en Base64 tras whsec_
TwilioX-Twilio-SignatureHMAC-SHA1Base64URL más los parámetros POST ordenados
GitHubX-Hub-Signature-256: sha256=…HMAC-SHA256hexcuerpo de la petición en bruto
StripeStripe-Signature: t=…,v1=…HMAC-SHA256hextimestamp.body

Si un valor de esta herramienta coincide con el hex pero tu código compara Base64, o al revés, el cálculo es correcto y solo difiere la codificación. Revisa en la documentación del proveedor qué se firma; los prefijos con marca de tiempo existen para impedir que se reenvíen peticiones antiguas.

Verificar una firma en código

Compara los bytes en bruto en tiempo constante y asegúrate de calcular el hash del cuerpo tal como se recibió:

const crypto = require("crypto");

function verifyWebhook(rawBody, secret, signatureHeader) {
  const expected = crypto.createHmac("sha256", secret).update(rawBody).digest();
  const given = Buffer.from(signatureHeader, "base64");
  return given.length === expected.length && crypto.timingSafeEqual(given, expected);
}

Con rawBody como el Buffer de la frase del zorro, el secreto key y el valor Base64 de la tabla, devuelve true. Si le pasas JSON.stringify(JSON.parse(body)) en lugar del cuerpo en bruto, devuelve false en cuanto el JSON del proveedor tenga un espacio que tu serializador elimina. En Express, eso significa leer el cuerpo con express.raw() en la ruta del webhook.

El equivalente en Python usa hmac.new(key, body, hashlib.sha256).digest(), lo codifica en Base64 y lo comprueba con hmac.compare_digest. En la línea de comandos, openssl dgst -sha256 -hmac 'key' -binary | base64 da el mismo Base64; usa -mac HMAC -macopt hexkey:… cuando la clave está en hex. Para una clave fuerte, el preset de secreto HMAC del generador de claves Base64 crea 32 bytes aleatorios. Para tokens firmados en lugar de peticiones firmadas, consulta el codificador JWT.

Preguntas frecuentes

¿Por qué no coincide el HMAC de mi webhook?

La firma cubre los bytes exactos del cuerpo de la petición. Si tu framework analizó el JSON y calculas el hash de una copia vuelta a serializar, cambian los espacios o el orden de las claves y el resultado es otro. Calcula el hash del cuerpo en bruto, comprueba si el proveedor espera hex o Base64 y si el secreto debe decodificarse antes.

¿El secreto HMAC es texto o Base64?

Depende del proveedor. La mayoría te da una cadena que se usa como texto UTF-8. Algunos entregan una clave codificada en Base64, a veces tras un prefijo como whsec_, que hay que decodificar a bytes antes de usarla. Ajusta La clave es en consecuencia.

¿Qué diferencia hay entre un hash y un HMAC?

Cualquiera puede calcular el SHA-256 de un mensaje, así que un hash solo detecta cambios accidentales. Un HMAC mezcla una clave secreta, de modo que solo quien tiene la clave puede generar un valor válido, y eso lo convierte en una firma.

¿Puedo usar HMAC-MD5 o HMAC-SHA1?

Ambos siguen en uso en API antiguas y son mucho más seguros que MD5 o SHA-1 a secas, porque las colisiones no se traducen en falsificaciones de HMAC. Para diseños nuevos, elige HMAC-SHA256.