Sobes.tech
Middle

O que é HMAC e como é utilizado?

sobes.tech IA

Resposta da IA

HMAC (Código de Autenticação de Mensagem baseado em Hash) é um mecanismo para verificar a integridade e autenticidade de uma mensagem usando uma chave secreta e uma função hash criptográfica.

Algoritmo de funcionamento:

  1. Formação de chaves internas e externas a partir da chave secreta e constantes (ipad, opad).
  2. Cálculo do hash interno: hash(chave secreta XOR ipad + mensagem).
  3. Cálculo do hash externo: hash(chave secreta XOR opad + hash interno). Isto é HMAC.

Usos:

  • Autenticação de pedidos API: O servidor e o cliente partilham uma chave secreta comum. O cliente calcula o HMAC para os dados do pedido e envia-o no cabeçalho. O servidor calcula o HMAC com os mesmos dados e chave, comparando-o com o valor enviado. Se coincidir, o pedido é considerado autêntico.
  • Verificação de integridade de dados: Se o HMAC da mensagem corresponder ao HMAC recalculado, pode-se ter certeza de que os dados não foram alterados durante a transmissão.
  • Uso em JSON Web Tokens (JWT): HMAC é frequentemente usado como algoritmo de assinatura digital (HS256, HS384, HS512) para garantir a integridade dos dados do token.

Exemplo de implementação (pseudo-código):

function hmacSHA256(key, message) {
    // Constantes de padding
    const blockSize = 64; // para SHA-256
    const ipad = 0x36;
    const opad = 0x5c;

    // Preparação da chave
    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;
}

// Em bibliotecas reais, a implementação é otimizada e diferente

A principal diferença do hash simples com chave (hash(chave + mensagem) ou hash(mensagem + chave)) é que o HMAC é resistente a ataques de extensão de mensagens, pois usa duas fases de hash com constantes de padding diferentes.