HMAC-SHA256 para la integridad de mensajes
Cree y verifique firmas HMAC-SHA256 para garantizar la integridad de las cargas útiles de la API.
HMAC-SHA256 para la integridad de mensajes es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.
¿Qué es HMAC?
HMAC (código de autenticación de mensajes basado en hash) combina una función hash criptográfica con una clave secreta para producir un MAC. Demuestra tanto que los datos no han sido manipulados como que el remitente conoce la clave secreta.
HMAC frente a un hash simple
Cualquiera puede calcular un hash SHA-256 simple. HMAC requiere la clave secreta; solo las partes que conocen la clave pueden crear o verificar un HMAC válido. Los hashes simples proporcionan integridad, pero no autenticación.
Cálculo de HMAC-SHA256 en Java
Utilice Mac.getInstance("HmacSHA256"), inicialícelo con un SecretKeySpec y llame a 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 hexVerificación de un HMAC
Vuelva a calcular el HMAC de los datos recibidos con la clave compartida. Utilice una comparación en tiempo constante (MessageDigest.isEqual) para evitar ataques de temporización.
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!");Generación de una clave segura
Las claves HMAC deben ser bytes aleatorios, no contraseñas. Utilice KeyGenerator o SecureRandom para generar una clave de 256 bits.
KeyGenerator kg = KeyGenerator.getInstance("HmacSHA256");
kg.init(256);
SecretKey key = kg.generateKey();
String b64Key = Base64.getEncoder().encodeToString(key.getEncoded());Firma de solicitudes de API con HMAC
Calcule el HMAC a partir del método HTTP, la ruta, la marca de tiempo y el cuerpo. Incluya el HMAC en el encabezado X-Signature. El servidor vuelve a calcularlo y lo compara para verificar que la solicitud no haya sido manipulada.
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);Prevención de ataques de repetición
Un atacante puede repetir una solicitud firmada válida. Incluya una marca de tiempo en la carga útil firmada y rechace las solicitudes que tengan más de unos 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");
}Verificación de webhooks con HMAC
GitHub, Stripe y muchos otros servicios firman los webhooks con HMAC. Verifique el encabezado X-Hub-Signature-256 para asegurarse de que el webhook procede del servicio y no ha sido 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 en JWT
HS256 (HMAC-SHA256) es un algoritmo de firma JWT común. El encabezado y la carga útil se firman con un secreto compartido. Tanto el emisor como el verificador deben conocer el secreto; es adecuado para microservicios dentro del mismo límite de confianza.
Rotación de claves HMAC
Rote las claves HMAC periódicamente. Durante la rotación, acepte durante un breve periodo de transición los HMAC generados con la clave antigua y con la nueva; después, retire la clave antigua.
Cuándo utilizar HMAC frente a firmas digitales
HMAC: simétrico; ambos lados comparten el secreto, es rápido y se utiliza para API internas y la verificación de webhooks. Firmas digitales (RSA/ECDSA): asimétricas; solo el firmante tiene la clave privada y cualquiera que tenga la clave pública puede verificarlas, por lo que son adecuadas para JWT en sistemas distribuidos.
Comprobación rápida
¿Por qué la comparación de HMAC debe utilizar una igualdad en tiempo constante?
Resumen
HMAC-SHA256 proporciona integridad autenticada: demuestra el origen de los datos y que no han sido manipulados. Utilice Mac.getInstance("HmacSHA256"). Utilice siempre una comparación en tiempo constante. Incluya marcas de tiempo para evitar ataques de repetición. Utilícelo para firmar API, verificar webhooks y firmar JWT HS256.
Preguntas frecuentes
¿La lección «HMAC-SHA256 para la integridad de mensajes» es gratis?
Sí — el texto completo de «HMAC-SHA256 para la integridad de mensajes» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.
¿Qué aprenderé en «HMAC-SHA256 para la integridad de mensajes»?
Cree y verifique firmas HMAC-SHA256 para garantizar la integridad de las cargas útiles de la API. Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Java Academy?
No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «HMAC-SHA256 para la integridad de mensajes»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Java Academy?
Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Hash criptográfico con MessageDigest
- Cifrado simétrico AES
- HMAC-SHA256 para la integridad de mensajes
- JWT: estructura, creación y verificación