Tema representativo de entrevista

Entrevista de código: Implementar la verificación de firmas HMAC para webhooks

CodingIntermedio
Equipo editorial de Offer.ccPublicado Actualizado

Pregunta

Implementa una función que acepte el cuerpo crudo de una solicitud, un encabezado de firma, un secreto compartido y la hora actual, y luego acepte o rechace el webhook de forma segura.

Planteamiento y contexto

El proveedor firma una marca de tiempo y el cuerpo crudo. Las solicitudes pueden retrasarse, duplicarse, estar mal formateadas o verse alteradas por el análisis sintáctico de JSON. La implementación debe rechazar alteraciones y ataques de reproducción (replay) sin filtrar tiempos de comparación.

Qué evalúa el entrevistador

  • Preservar los bytes exactos y analizar sintácticamente un encabezado de firma estructurado de forma segura.
  • Calcular HMAC con el algoritmo especificado y comparar en tiempo constante.
  • Aplicar la tolerancia de la marca de tiempo y un comportamiento de fallo claro.

Preguntas de clarificación antes de responder

  • ¿Qué cadena firmada exacta, algoritmo de resumen (digest), codificación y formato de encabezado especifica el proveedor?
  • ¿Está disponible el cuerpo como bytes crudos antes del análisis sintáctico de JSON?
  • ¿Qué tolerancia de desfase de reloj (clock-skew) e identificador de reproducción se requieren?
  • ¿Debe la entrada mal formateada devolver un rechazo genérico sin revelar qué comprobación falló?

Estructura de respuesta en 30 segundos

Leerías los bytes crudos, analizarías la marca de tiempo y la firma sin confiar en sus tipos, rechazarías marcas de tiempo fuera de la ventana permitida y calcularías HMAC sobre la cadena canónica definida por el proveedor. Compararías los bytes de MAC decodificados con una primitiva de tiempo constante, para luego desduplicar el ID de evento antes de encolar. Los errores devuelven un único rechazo genérico mientras que las métricas internas clasifican el fallo.

Análisis detallado paso a paso

1. Mantener el cuerpo crudo

No conviertas a cadena el JSON analizado para la verificación. Los espacios en blanco, el orden de las claves y el escape de Unicode pueden cambiar los bytes. Lee el cuerpo una sola vez, aplica un límite de tamaño y pasa los mismos bytes a la verificación y al análisis sintáctico posterior.

2. Analizar y validar el encabezado

Divide el encabezado en marca de tiempo y firmas versionadas, rechaza duplicados o codificaciones no válidas y limita la longitud de la marca de tiempo. Convierte la marca de tiempo a un entero y rechaza valores fuera de la ventana de desfase configurada antes de realizar operaciones costosas.

3. Calcular y comparar

Construye el mensaje firmado exacto, calcula HMAC con el resumen configurado, decodifica la firma suministrada y compara arreglos de bytes de igual longitud con una función de tiempo constante. Nunca compares cadenas hexadecimales con igualdad ordinaria cuando un atacante pueda medir los tiempos de respuesta.

4. Prevenir la reproducción (replay)

Tras la verificación de la firma, exige un ID de evento estable y regístralo atómicamente con un período de retención al menos tan largo como la ventana de marca de tiempo aceptada. Una solicitud válida duplicada puede devolver éxito sin repetir el efecto de negocio.

5. Probar casos límite

Prueba bytes alterados, secreto incorrecto, algoritmo incorrecto, encabezado mal formateado, marcas de tiempo antiguas y futuras, firmas duplicadas, cuerpos vacíos, cuerpos sobredimensionados e IDs de eventos repetidos. Mantén los registros libres de secretos y payloads completos.

Ejemplo de respuesta de alta calidad

“Preservaría el cuerpo crudo, analizaría y limitaría la marca de tiempo, rechazaría lo que quede fuera de la ventana de reproducción y construiría la cadena firmada exacta del proveedor. Calcularía HMAC con el resumen requerido, decodificaría la firma y usaría una comparación de bytes en tiempo constante. Después de la verificación, desduplicaría atómicamente el ID de evento antes de encolar. Las entradas mal formateadas reciben un único rechazo genérico; los contadores internos distinguen fallos de análisis sintáctico, tiempo, MAC y reproducción.”

Errores comunes

  • Verificar JSON analizado → la serialización puede cambiar los bytes firmados → verifica el cuerpo crudo.
  • Usar igualdad de cadenas ordinaria → las diferencias de tiempo pueden revelar coincidencias parciales → usa comparación de bytes en tiempo constante.
  • Omitir comprobaciones de marca de tiempo → las firmas válidas pueden reproducirse → aplica una ventana acotada y desduplicación de eventos.
  • Registrar encabezados y payloads → se filtran secretos o datos personales → registra únicamente IDs seguros y tipos de fallos.

Preguntas de seguimiento y respuestas

¿Por qué verificar antes de analizar sintácticamente?

Analizar primero puede normalizar los bytes y consumir un flujo de solicitud de un solo uso. La verificación debe cubrir exactamente lo que firmó el proveedor; analiza únicamente después de la aceptación.

¿Se pueden aceptar dos firmas durante una rotación?

Sí, si el proveedor documenta un periodo de superposición. Prueba únicamente las versiones activa y en retirada dentro de una ventana acotada, registra qué versión pasó y haz expirar el secreto antiguo.

¿Es suficiente la validación de la marca de tiempo para la protección contra reproducción?

No. Una solicitud válida puede reproducirse repetidamente dentro de la ventana. Almacena un ID de evento o resumen estable de forma atómica y haz que la operación de negocio sea idempotente.

Fuentes públicas

Preguntas relacionadas

Herramienta de entrevista relacionada

Usa Captura para un ejercicio de código

Captura el problema y luego aborda en orden las restricciones, la solución, el código, los casos extremos y la complejidad.

Ver la herramienta