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:
- Formação de chaves internas e externas a partir da chave secreta e constantes (
ipad,opad). - Cálculo do hash interno:
hash(chave secreta XOR ipad + mensagem). - 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.