Richiedi la firma per l'API REST

2

Sto costruendo un'API REST che riceverà richieste come:

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

Questo sembra semplice: avere il client HMAC (percorso + query, chiave), mandarmi un identificatore chiave e HMAC in un'intestazione o qualcosa del genere, e poi faccio lo stesso sul server per vedere se corrispondono.

Ecco la mia preoccupazione:

POST /api/entities

{ "foo": "bar" }

Se il cliente calcola l'HMAC su quel percorso e fa una query, teoricamente HMAC potrebbe essere utilizzato per inviare qualsiasi corpo.

tl; dr Come si implementerebbe correttamente la firma delle richieste per richieste GET, POST, PUT che potrebbero o meno avere un corpo JSON?

    
posta Jason 21.05.2015 - 00:30
fonte

1 risposta

3

Dovresti HMAC anche il carico utile. Poiché hai menzionato l'inclusione di un'intestazione con HMAC del percorso e parametri di query, potresti avere un'intestazione separata che contiene l'HMAC del corpo. Tuttavia, probabilmente vorrai solo un HMAC da inviare, quindi un utente malintenzionato non potrebbe mescolare e abbinare le diverse sezioni. Quindi potresti fare qualcosa del genere:

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

Potresti voler eliminare HMAC tutti insieme e utilizzare TLS con i certificati client. Gli HMAC sarebbero soggetti a replay attack, a meno che non si introducano nonces. Inoltre, devi considerare che le specifiche HTTP possono essere difficili da interpretare in modo coerente. Browser diversi (e librerie client) hanno approcci diversi per cose come la codifica dei caratteri. Un'applicazione può voler inviare a?b=' ma un'altra può inviare a?b=%27 , prima di decodificare, queste due stringhe risorsa / query avranno HMAC molto diversi.

    
risposta data 21.05.2015 - 01:55
fonte

Leggi altre domande sui tag