HMAC-SHA256 para integridade de mensagens
Crie e verifique assinaturas HMAC-SHA256 para garantir a integridade das cargas da API.
HMAC-SHA256 para integridade de mensagens é uma aula grátis de Java Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Java Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Java Academy inclui 4 aulas no total.
O que é HMAC?
HMAC (código de autenticação de mensagens baseado em hash) combina uma função de hash criptográfica com uma chave secreta para produzir um MAC. Ele comprova tanto que os dados não foram adulterados AND que o remetente conhece a chave secreta.
HMAC versus hash simples
Qualquer pessoa pode calcular um hash SHA-256 simples. O HMAC exige a chave secreta — somente as partes que conhecem a chave podem criar ou verificar um HMAC válido. Hashes simples garantem integridade, mas não autenticação.
Calculando HMAC-SHA256 em Java
Utilize Mac.getInstance("HmacSHA256"), inicialize-o com uma SecretKeySpec e chame doFinal(data).
byte[] keyBytes = "my-secret-key".getBytes(StandardCharsets.UTF_8);
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(keySpec);
byte[] hmac = mac.doFinal("payload data".getBytes(StandardCharsets.UTF_8));
String hmacHex = HexFormat.of().formatHex(hmac);
System.out.println(hmacHex); // 64-char hexVerificando um HMAC
Recalcule o HMAC dos dados recebidos usando a chave compartilhada. Utilize uma comparação em tempo constante (MessageDigest.isEqual) para evitar ataques de temporização.
byte[] expectedHmac = computeHmac(key, receivedPayload);
byte[] actualHmac = HexFormat.of().parseHex(receivedHmacHex);
boolean valid = MessageDigest.isEqual(expectedHmac, actualHmac);
if (!valid) throw new SecurityException("HMAC verification failed — data tampered!");Gerando uma chave segura
As chaves HMAC devem ser compostas por bytes aleatórios, não por senhas. Utilize KeyGenerator ou SecureRandom para gerar uma chave de 256 bits.
KeyGenerator kg = KeyGenerator.getInstance("HmacSHA256");
kg.init(256);
SecretKey key = kg.generateKey();
String b64Key = Base64.getEncoder().encodeToString(key.getEncoded());HMAC para assinatura de requisições de API
Calcule o HMAC sobre o método HTTP, o caminho, o carimbo de data e hora e o corpo. Inclua o HMAC no cabeçalho X-Signature. O servidor recalcula o valor e o compara para verificar se a requisição não foi adulterada.
String payload = method + "\n" + path + "\n" + timestamp + "\n" + body;
byte[] hmac = computeHmac(apiSecretKey, payload);
request.header("X-Signature", "hmac-sha256=" + HexFormat.of().formatHex(hmac));
request.header("X-Timestamp", timestamp);Prevenção de ataques de repetição
Um invasor pode repetir uma requisição assinada válida. Inclua um carimbo de data e hora na carga útil assinada e rejeite requisições com mais de alguns minutos.
long timestamp = Long.parseLong(request.getHeader("X-Timestamp"));
if (Math.abs(System.currentTimeMillis() / 1000 - timestamp) > 300) {
throw new SecurityException("Request too old — possible replay attack");
}HMAC para verificação de webhooks
GitHub, Stripe e muitos serviços assinam webhooks com HMAC. Verifique o cabeçalho X-Hub-Signature-256 para garantir que o webhook veio do serviço e não foi modificado.
// GitHub webhook verification:
String received = request.getHeader("X-Hub-Signature-256").replace("sha256=","");
byte[] expected = computeHmac(webhookSecret, request.getBody());
boolean valid = MessageDigest.isEqual(expected, HexFormat.of().parseHex(received));HMAC em JWT
HS256 (HMAC-SHA256) é um algoritmo comum de assinatura de JWT. O cabeçalho e a carga útil são assinados com um segredo compartilhado. Tanto o emissor quanto o verificador precisam conhecer o segredo — isso é adequado para microsserviços na mesma fronteira de confiança.
Rotação de chaves HMAC
Faça a rotação das chaves HMAC periodicamente. Durante a rotação, aceite os HMACs da chave antiga e da nova por um curto período de sobreposição e, depois, aposente a chave antiga.
Quando utilizar HMAC versus assinaturas digitais
HMAC: simétrico — ambos os lados compartilham o segredo, é rápido e serve para APIs internas e verificação de webhooks. Assinaturas digitais (RSA/ECDSA): assimétricas — somente o assinante possui a chave privada, e qualquer pessoa com a chave pública pode verificá-las; são adequadas para JWTs em sistemas distribuídos.
Verificação rápida
Por que a comparação de HMAC deve utilizar igualdade em tempo constante?
Recapitulação
HMAC-SHA256 fornece integridade autenticada — comprova a origem dos dados e que eles não foram adulterados. Utilize Mac.getInstance("HmacSHA256"). Utilize sempre uma comparação em tempo constante. Inclua carimbos de data e hora para evitar ataques de repetição. Utilize-o para assinar APIs, verificar webhooks e assinar JWTs HS256.
Perguntas Frequentes
A aula “HMAC-SHA256 para integridade de mensagens” é grátis?
Sim — o texto completo de “HMAC-SHA256 para integridade de mensagens” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Java Academy, atualize para CoddyKit PRO. O curso de Java Academy inclui 4 aulas no total.
O que vou aprender em “HMAC-SHA256 para integridade de mensagens”?
Crie e verifique assinaturas HMAC-SHA256 para garantir a integridade das cargas da API. Você pratica Java Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Java Academy?
Nenhuma experiência prévia é necessária. Java Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “HMAC-SHA256 para integridade de mensagens”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Java Academy?
Sim. Cada aula de Java Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Hash criptográfico com MessageDigest
- Criptografia simétrica AES
- HMAC-SHA256 para integridade de mensagens
- JWT: estrutura, criação e verificação