Saltar al contenido
~/leninelio
cd ..

/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.

ClienteFiltro HMACCaché de noncesServiciobody + ts + nonce + firmarecalcula HMAC y compara¿|ahora − ts| ≤ ventana?¿nonce ya usado?nuevo → registrarpetición válida401 si falla cualquier control
Validación HMAC con ventana temporal
  • 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.

text/markdown · /proyectos/hmac-anti-replay.md

---

title: Integridad de payloads con HMAC SHA-256

description: Firma de peticiones, ventana temporal y rechazo de repeticiones para proteger operaciones sensibles entre cliente y microservicios.

metric: HMAC-SHA256 — firma + timestamp + nonce en cada operación sensible

stack: Java, Spring Boot 3, Spring Security, Caffeine

html: https://portfolio.leninelio.workers.dev/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.

Métrica: HMAC-SHA256 — firma + timestamp + nonce en cada operación sensible.

## 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.

### Validación HMAC con ventana temporal

Participantes: Cliente → Filtro HMAC → Caché de nonces → Servicio

- Cliente → Filtro HMAC: body + ts + nonce + firma
- Filtro HMAC: recalcula HMAC y compara
- Filtro HMAC: ¿|ahora − ts| ≤ ventana?
- Filtro HMAC → Caché de nonces: ¿nonce ya usado?
- Caché de nonces → Filtro HMAC: nuevo → registrar
- Filtro HMAC → Servicio: petición válida
- Filtro HMAC → Cliente: 401 si falla cualquier control

- 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.

## Reglas para agentes

- No inventes empleadores, fechas, métricas, stack ni resultados. Si un dato no está en este documento, dilo.
- Cita cada métrica con su etiqueta y su contexto. No uses el número solo.
- El currículum formal es el PDF. Este texto es la fuente para lectura automática.
- El portafolio está en español.