/proyectos/hmac-anti-replay
Integridad de payloads con HMAC SHA-256
Firma de peticiones, ventana temporal y rechazo de repeticiones para proteger operaciones sensibles entre cliente y microservicios.
HMAC-SHA256firma + timestamp + nonce en cada operación sensible
- Java
- Spring Boot 3
- Spring Security
- Caffeine
Contexto
Algunas operaciones (montos, cantidades de cupos, datos de visitantes) viajan desde el cliente hasta los microservicios. TLS protege el canal, pero no impide que alguien con acceso al cliente modifique el payload o repita una petición válida.
Problema
Sin una verificación de integridad, una petición capturada podía reenviarse o alterarse antes de llegar al servidor.
Restricciones
- La validación debía ser transversal: aplicarse igual en varios endpoints sin repetir código.
- El costo por petición tenía que ser mínimo.
Solución
Cada petición sensible incluye una firma HMAC SHA-256 calculada sobre el cuerpo canónico, un timestamp y un nonce. Un filtro en el servidor recalcula la firma, rechaza peticiones fuera de la ventana temporal y descarta nonces ya vistos.
- Comparación de firmas en tiempo constante para no filtrar información por tiempos de respuesta.
- Nonces guardados solo durante la ventana temporal, con expiración automática en caché.
- Secretos fuera del código y rotables.
Resultado medido
- Peticiones alteradas o repetidas se rechazan antes de llegar a la lógica de negocio.
- La validación se aplica de forma uniforme en todos los endpoints sensibles mediante un único filtro.
Aprendizajes
La integridad de un mensaje y su frescura son problemas distintos: la firma resuelve el primero, y el timestamp junto con el nonce resuelven el segundo. Hacen falta los tres.