Autenticazione e sicurezza di un'API REST

3

Scenario: progetto una API REST in cui gli utenti autenticati possono raggiungere l'API su TLS. Devo usare TLS poiché i dati trasmessi sul filo sono sensibili. Non ho bisogno di autorizzazione in questo momento, ma non voglio escludere questa possibilità. Voglio usare un qualche tipo di metodo API Key (/ Secret). Preferirei evitare l'uso di OAuth. Ho due possibili soluzioni. In entrambi i casi, la chiave API (e segreta) verrebbe generata da noi.

I. Chiave API semplice

Includere una chiave API nell'intestazione HTTP, posso autenticare il client in base a tale intestazione. La chiave API è sicura, a causa di TLS. Gli attacchi di riproduzione non sono possibili, garantiti anche da TLS. Molto semplice da implementare dai nostri clienti. Per quanto comprendo TLS, la richiesta non può essere alterata (MAC). Tutte le misure di sicurezza sono fornite da TLS. Il client aggiunge solo l'intestazione HTTP Key API.

II. Firma HMAC con un'API segreta

La richiesta dovrebbe includere una firma, l'hash con il segreto, il timestamp e l'hash del carico utile della richiesta. Ora non può essere manomesso o riprodotto e il segreto non viene nemmeno trasmesso sul filo. Più sicuro, ma difficile da implementare dal lato client. (scrivere librerie client non è un'opzione)

La prima soluzione pone qualche minaccia e fornisce una sicurezza sufficiente ai miei clienti (e alla nostra API), o dovrei usare la seconda più complicata? Inoltre, quali sono le carenze del primo?

    
posta gmate 05.01.2015 - 19:11
fonte

1 risposta

3

Se stai già utilizzando TLS, mi piacerebbe utilizzare una chiave API segreta nell'intestazione. Con una chiave API è possibile memorizzare quello crittografato che ti protegge in caso di violazione. Assicurati che l'applicazione e il server non stiano registrando la chiave segreta in alcun modo e spingere il tuo client a utilizzare chiavi lunghe e complesse. Questi saranno gestiti da sistemi non persone, quindi non ci dovrebbe essere bruciore di stomaco con il fatto di presentare una chiave lunga e complicata ad ogni richiesta.

Le firme hmac sono utili se si desidera utilizzare un canale non crittografato e accettarne un po 'o rischiare. In questo caso l'HMAC non fornisce alcun vantaggio e richiede la memorizzazione del segreto in testo semplice. In questo caso, considererei una chiave segreta più sicura di una firma.

Per quanto riguarda le prestazioni, saranno simili.

Un'altra nota: dato che sei TLS, dovresti fare in modo di assicurarti che i tuoi documenti di esempio e howto chiariscano come stabilire correttamente la connessione e che l'allarme ai disallineamenti dei certificati e il tuo client SDK lo faccia per impostazione predefinita.

    
risposta data 05.01.2015 - 19:41
fonte

Leggi altre domande sui tag