HMAC exige uma chave além da mensagem

SHA-256 simples calcula o hash dos bytes da mensagem. HMAC-SHA-256 calcula um valor de autenticação a partir de chave e mensagem. A construção do RFC 2104 não é simplesmente colocar a chave antes da mensagem e calcular o hash. A correspondência de um hash sem chave não autentica o remetente por si só.

SHA-256 recebe mensagem; HMAC-SHA-256 recebe chave e mensagem. Ambas as saídas têm 256 bits
M é a mensagem; K é a chave. Diagrama conceitual original das entradas. Tamanho igual não significa valores ou funções iguais.

RFC 2104 §2: HMAC

Reproduza os bytes da chave de teste RFC

O caso 1 do RFC 4231 usa vinte bytes 0x0b e a mensagem Hi There. O código abaixo importa uma chave HMAC do Web Crypto e exibe o resultado hexadecimal. Repetir o texto 0b vinte vezes gera 40 bytes, outra entrada. Esta é uma chave pública de teste, não um segredo de produção.

A ferramenta do Moyoutil calcula hashes SHA simples e não tem entrada HMAC. Este é um exemplo JavaScript separado, não um sistema completo de login ou verificação de webhooks. Autenticação real exige proteção da chave secreta e verificação correta.

const hex = bytes => Array.from(new Uint8Array(bytes),
  n => n.toString(16).padStart(2, '0')).join('');
const keyBytes = new Uint8Array(20).fill(0x0b);
const message = new TextEncoder().encode('Hi There');
const key = await crypto.subtle.importKey(
  'raw', keyBytes, {name:'HMAC', hash:'SHA-256'},
  false, ['sign']);
const mac = await crypto.subtle.sign('HMAC', key, message);
console.log(hex(mac));
// b0344c61d8db38535ca8afceaf0bf12b
// 881dc200c9833da726e9376c2e32cff7

RFC 4231 §4.2: Test Case 1

W3C Web Cryptography: HMAC

Perguntas frequentes

Posso comparar resultados porque ambos os nomes contêm SHA-256?

Não confunda SHA-256 simples com HMAC-SHA-256. Comparar HMAC exige os mesmos bytes de chave e mensagem e o mesmo algoritmo. Diferencie também representações como hexadecimal e Base64.