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?