Solicitud de firma para la API REST

2

Estoy creando una API REST que recibirá solicitudes como:

GET /api/entities
GET /api/entities?filter=X&sort=Y

Esto parece sencillo: tener el cliente HMAC (ruta + consulta, clave), enviarme un identificador de clave y HMAC en un encabezado o algo, y luego hago lo mismo en el servidor para ver si coinciden.

Aquí está mi preocupación:

POST /api/entities

{ "foo": "bar" }

Si el cliente calcula el HMAC en esa ruta y consulta, teóricamente ese HMAC podría usarse para enviar cualquier cuerpo.

tl; dr ¿Cómo se implementaría correctamente la firma de solicitud para las solicitudes GET, POST, PUT que pueden o no tener un cuerpo JSON?

    
pregunta Jason 21.05.2015 - 00:30
fuente

1 respuesta

3

También debes HMAC la carga útil. Como mencionó la inclusión de un encabezado con el HMAC de la ruta y los parámetros de consulta, podría tener un encabezado separado que contenga el HMAC del cuerpo. Sin embargo, es probable que solo desee que se envíe un HMAC, por lo que un atacante no podría mezclar y combinar las diferentes secciones. Así podrías hacer algo como esto:

HMAC-Signature: HMAC( HMAC(path + query, key) + HMAC(body, key), key)

Es posible que desee desechar todo HMAC y usar TLS con certificados de cliente. Los HMAC estarían sujetos a ataques de repetición, a menos que introduzcas nonces. Además, debe tener en cuenta que la especificación HTTP puede ser difícil de interpretar de manera consistente. Los diferentes navegadores (y las bibliotecas cliente) tienen enfoques diferentes para cosas como la codificación de caracteres. Una aplicación puede querer enviar a?b=' pero otra puede enviar a?b=%27 , antes de decodificar, estas dos cadenas de recursos / consulta tendrán HMAC muy diferentes.

    
respondido por el amccormack 21.05.2015 - 01:55
fuente

Lea otras preguntas en las etiquetas