Calcula una firma HMAC para cualquier mensaje y clave usando SHA-1, SHA-256, SHA-384 o SHA-512, con salida hex, base64 o base64url.
Codigos de autenticacion en local. HMAC combina una funcion hash con una clave secreta para que el receptor verifique integridad y autenticidad. Calculado en tu navegador con Web Crypto.
Para que sirve HMAC
Autenticacion, no cifrado
Un HMAC no oculta nada. Responde a otra pregunta: ¿produjo este mensaje exacto alguien que posee el secreto compartido, y ha sido alterado desde entonces? La salida es una etiqueta de tamano fijo que envias junto al mensaje; el receptor la recalcula con la misma clave y compara. Etiquetas iguales significan que el mensaje es autentico e intacto. Etiquetas distintas significan que no es ni una cosa ni la otra, sin forma de saber cual.
Esto convierte a HMAC en el caballo de batalla de las firmas de webhook, la firma de peticiones de API, las cookies firmadas y los tokens de sesion. Stripe, GitHub y la mayoria de proveedores de webhooks firman asi sus payloads para que puedas verificar que la peticion viene realmente de ellos y no de alguien que adivino la URL de tu endpoint.
Por que no basta con hashear clave y mensaje juntos
La construccion obvia, SHA256(clave + mensaje), esta rota frente a hashes Merkle-Damgard como SHA-1 y SHA-256. Esos hashes procesan datos por bloques y arrastran estado, de modo que un atacante que conozca un digest valido puede anadir datos y calcular un digest valido del mensaje extendido sin llegar a conocer la clave. Es el ataque de extension de longitud, y no es teorico: ha roto APIs reales.
La construccion anidada de HMAC, H(clave XOR opad || H(clave XOR ipad || mensaje)), cierra ese agujero. Las dos pasadas con claves rellenadas de forma distinta hacen que el digest final no sea el estado interno crudo de un hash sobre datos influidos por el atacante. Por eso conviene recurrir siempre a HMAC en lugar de inventarse un hash con clave propio.
Notas practicas
Elige SHA-256 salvo que algo externo te obligue. SHA-1 sigue siendo seguro dentro de HMAC porque la construccion no depende de la resistencia a colisiones, pero un sistema nuevo no tiene motivo para usarlo y los auditores lo senalaran. SHA-512 no es significativamente mas fuerte para esto y a veces es mas rapido en hardware de 64 bits.
Dos detalles de implementacion importan mas que la eleccion del hash. Primero, compara las etiquetas en tiempo constante: una comparacion de cadenas normal sale al primer byte distinto, y eso filtra suficiente informacion temporal para falsificar una etiqueta byte a byte. Segundo, las claves deben ser bytes aleatorios de al menos la longitud del digest, no una frase facil de recordar; las claves HMAC no son hashes de contrasena y no reciben ningun estiramiento.
Preguntas frecuentes
¿Se envía mi secreto a algún sitio?
No. La clave y el mensaje nunca salen de tu navegador; la firma se calcula localmente con la Web Crypto API y no se transmite ni se almacena nada.
¿Qué algoritmo debo elegir?
Usa SHA-256 para trabajo nuevo. SHA-384 y SHA-512 amplían el margen de seguridad con un coste mínimo; SHA-1 solo existe por interoperabilidad con sistemas antiguos.
¿Cuál es la diferencia entre base64 y base64url?
Base64url sustituye + y / por - y _ y elimina el relleno, lo que permite colocar el resultado en URL, nombres de archivo y cabeceras HTTP sin escaparlo.
¿HMAC es una forma de cifrado?
No. Demuestra que el mensaje procede de quien posee la clave y que no se ha modificado, pero el mensaje sigue siendo legible. Añade TLS o cifrado si además necesitas confidencialidad.
¿Por qué no basta con hashear la clave y el mensaje juntos?
SHA-2 a secas es vulnerable a la extensión de longitud: un atacante puede añadir datos a un mensaje firmado y falsificar un resumen válido sin conocer la clave. La construcción anidada de HMAC lo impide.
¿Cómo debo comparar dos HMAC en código?
Con una comparación de tiempo constante como crypto.timingSafeEqual. Un == normal sale en el primer byte distinto y puede filtrar la firma correcta byte a byte.