Cómo a Usar HMAC para Authentication
Generar and verify HMAC signatures to authenticate messages and API requests.
问题
You necesitar a prove ese un mensaje o API petición was sent por someone who knows un shared secret clave, y ese it was no modified en transit.
Requisitos previos
- Understanding of hash functions
- Knowledge of shared secret keys
Pasos
-
1. Prepare the message and key
Define the message to authenticate (e.g., an API request body or a timestamp + payload). Agree on a secret key with the other party. The key should be at least as long as the hash output (32 bytes for HMAC-SHA256).
entradamessage: 'payload' | key: 'secret'输出ready to sign -
2. Compute the HMAC
Run HMAC-SHA256 with the key and message. HMAC wraps the hash function with key mixing, producing a tag that only someone with the key can compute. The tag is typically sent as a hex or Base64 string alongside the message.
entradaHMAC-SHA256(key, message)输出tag: a1b2c3... -
3. Verify on the receiving end
The recipient recomputes the HMAC with the same key and message and compares it to the received tag using a constant-time comparison. If they match, the message is authentic and unmodified. If they differ, reject the message.
entradarecomputed tag == received tag输出verified ✓
Resultado esperado
Un HMAC etiqueta ese authenticates el mensaje source y integrity, verifiable por anyone con el shared clave.
Errores comunes
- Comparing tags with a non-constant-time comparison
- Use a constant-time comparison (e.g., crypto.timingSafeEqual) to prevent timing attacks that leak the tag byte by byte.
- Including the key in the message
- The key is never sent. Only the message and the HMAC tag are transmitted. The key stays on both sides.
Solución de problemas指引
- If verification fails, check that the message is byte-identical on both sides (no encoding differences).
- Include a timestamp or nonce in the message to prevent replay attacks.
Límites de seguridad
- HMAC security depends on the secrecy of the key and the collision resistance of the underlying hash. Use SHA-256 or stronger.
- All computation is local.