Sobes.tech
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:

  1. Formación de claves internas y externas a partir de la clave secreta y constantes (ipad, opad).
  2. Cálculo del hash interno: hash(clave secreta XOR ipad + mensaje).
  3. 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.