Verificar la firma HMAC del webhook: cómo hacerlo bien
Qué demuestra realmente HMAC
El esquema exacto que usa Olmira
X-Aether-Signature, X-Aether-Webhook-Id y X-Aether-Event. (El prefijo de la cabecera pone Aether y no Olmira: es un resto del nombre en clave interno de la plataforma; no afecta en nada al funcionamiento del esquema, solo a cómo se llama literalmente la cabecera.)Verificar una entrega, en términos llanos
crypto integrado de Node cubre todo esto sin una sola dependencia; las comprobaciones previas de más abajo son donde las implementaciones correctas realmente se diferencian de las rotas.Los errores que rompen la verificación
.— es la segunda más habitual, y es fácil caer en ella porque el cuerpo es lo más «evidente» que hashear.Antes de fiarte de ello en producción
Comprueba primero la ventana de tiempo
Rechaza cualquier cosa fuera de una tolerancia pequeña (Olmira publica 300 segundos, cinco minutos, como su propia cifra de referencia) antes de gastar tiempo de CPU en calcular hashes: una firma caducada no merece la comparación.
Compara en tiempo constante
Usa la primitiva de comparación en tiempo constante de tu lenguaje, no una comprobación de igualdad normal, para que una discordancia nunca filtre información temporal sobre lo cerca que estaba un intento.
Confirma que calculas el hash del cuerpo en bruto
Registra al menos una vez durante la configuración la cadena exacta que tu código va a pasar por el hash y compárala, byte a byte, con lo que envió realmente una entrega de prueba.
Prevé la rotación de la clave secreta
Guardes donde guardes el secreto, haz que cambiarlo sea una modificación de configuración de una sola línea: rotarlo en el panel sin actualizarlo en ese mismo momento hace que todas las entregas empiecen a fallar hasta que te pongas al día.
Cómo lo resuelve Olmira
Lecturas relacionadas
Errores de datos en la importación CSV — y cómo solucionarlos — la misma disciplina de «verificar de forma explícita, no confiar en silencio», aplicada a los datos que fluyen en sentido contrario.
Sacar tu negocio de las hojas de cálculo: un mapa práctico — de dónde suelen venir los datos importados, para empezar.
Las IP de origen cambian —detrás de balanceadores de carga, con los cambios de infraestructura del proveedor, con el tiempo— y ponerlas en una lista de permitidos resulta frágil en la práctica. Una firma criptográfica demuestra la autenticidad sea cual sea la ruta de red, lo que es una garantía más sólida y estable que «la petición venía de un rango que hoy reconocíamos».
No: el esquema es idéntico en todas partes. Lo único que cambia por endpoint es el propio secreto, porque cada uno se genera de forma independiente.
No: verifica la firma, responde con un acuse rápido y haz después, de forma asíncrona, todo lo lento (escrituras en base de datos, llamadas a otros sistemas). Un emisor de webhooks al que se le agote el tiempo de espera de tu endpoint suele tratarlo como un fallo y reintentar, y no te interesa provocar eso por ser lento en vez de por fallar de verdad.
Recházalo antes de procesar cualquier otra cosa: una respuesta 4xx y nada más. No describas en el cuerpo de la respuesta por qué falló; un atacante que sondea tu endpoint no debería obtener información gratis sobre qué parte de una firma falsificada estaba mal.