Middle
¿Qué es HMAC y cómo se utiliza?
sobes.tech AI
Respuesta de la IA
HMAC (Código de Autenticación de Mensajes basado en Hash) es un mecanismo para verificar la integridad y autenticidad de un mensaje utilizando una clave secreta y una función hash criptográfica.
Algoritmo de funcionamiento:
- Formación de claves internas y externas a partir de la clave secreta y constantes (
ipad,opad). - Cálculo del hash interno:
hash(clave secreta XOR ipad + mensaje). - Cálculo del hash externo:
hash(clave secreta XOR opad + hash interno). Esto es HMAC.
Usos:
- Autenticación de solicitudes API: El servidor y el cliente comparten una clave secreta común. El cliente calcula el HMAC para los datos de la solicitud y lo envía en el encabezado. El servidor calcula el HMAC con los mismos datos y clave, comparándolo con el valor enviado. Si coinciden, la solicitud se considera auténtica.
- Verificación de integridad de datos: Si el HMAC del mensaje coincide con el HMAC recalculado, se puede estar seguro de que los datos no han sido modificados durante la transmisión.
- Uso en JSON Web Tokens (JWT): HMAC se usa a menudo como algoritmo de firma digital (HS256, HS384, HS512) para garantizar la integridad de los datos del token.
Ejemplo de implementación (pseudocódigo):
function hmacSHA256(key, message) {
// Constantes de padding
const blockSize = 64; // para SHA-256
const ipad = 0x36;
const opad = 0x5c;
// Preparación de la clave
let paddedKey = key;
if (key.length > blockSize) {
paddedKey = sha256(key);
}
while (paddedKey.length < blockSize) {
paddedKey += 0x00;
}
// Hash interno
const innerPaddedKey = xor(paddedKey, ipad);
const innerHash = sha256(innerPaddedKey + message);
// Hash externo (HMAC)
const outerPaddedKey = xor(paddedKey, opad);
const hmac = sha256(outerPaddedKey + innerHash);
return hmac;
}
// En bibliotecas reales, la implementación está optimizada y difiere
La diferencia clave con el simple hash con clave (hash(clave + mensaje) o hash(mensaje + clave)) es que HMAC es resistente a ataques de extensión de mensajes, ya que utiliza dos fases de hash con diferentes constantes de padding.