Protezione dell'API REST senza inviare o archiviare credenziali chiare

2

Attualmente stiamo progettando un'API REST e stiamo pensando di metterlo al sicuro.
Passando attraverso molta documentazione, è diventato chiaro che sono disponibili 2 opzioni.

Autenticazione HMAC

Mediante hashing con HMAC-sha1 una serie di elementi predefiniti con secret_key, firmiamo la richiesta. La verifica viene eseguita facendo esattamente lo stesso lato del server di elaborazione e confrontando gli hash risultanti.

La nostra implementazione va così:

  • Ottenere la data / ora corrente
  • Creazione di HMAC: hmac(full_url + request_body + timestamp + secret_key + token)
  • Invio della firma come: clientId + hmac_signature + timestamp + token

Il vantaggio principale di questo è che il tasto segreto non viene mai trasmesso nella richiesta, il che impedisce principalmente gli attacchi di riproduzione. Ma come svantaggio dobbiamo memorizzare le credenziali del cliente (tasto segreto) in un formato raw nel nostro database. E se il nostro database viene compromesso, potremmo anche revocare tutte le credenziali dei client API correnti.

Autenticazione HTTPS

L'utilizzo di SSL tramite la nostra API ci consentirà di creare un canale sicuro per lo scambio di informazioni private.
Fondamentalmente inviamo le stesse informazioni senza doverle modificare con HMAC.

Il nostro design sarà esattamente come (o molto simile a) la specifica OAuth2.

Il confronto con HMAC ha molti vantaggi in quanto deleghiamo la maggior parte del lavoro a SSL. E i client non devono includere una libreria per hashing come con HMAC. Infine, il nostro database è sicuro poiché la chiave segreta del client sarà memorizzata in modo sicuro.

Ma se qualcuno annota con successo una richiesta, può rubare la chiave segreta e iniziare a creare le sue richieste.

C'è un modo per utilizzare i vantaggi di HTTPS senza inviare credenziali chiare e senza dover memorizzare credenziali chiare?

Uno dei nostri progetti alternativi utilizzava lato client privato / pubblico generato dalla chiave e lo utilizzava per scambiare una chiave per crittografare secret_key per future richieste. Ma non molti browser hanno questa capacità ( <keygen> ) ed è piuttosto una seccatura per le applicazioni mobili.

    
posta Cyrbil 13.07.2015 - 16:52
fonte

1 risposta

2

Come sottolineato nei commenti, ssl / tls proteggerà le tue credenziali in transito. La crittografia del traffico è parte dello scopo del protocollo. L'altro scopo principale del protocollo: verificare che comunichi direttamente con la parte che pensi di comunicare.

L'OP ha detto che i proxy ssl sono possibili e l'hanno visto in azione per le applicazioni mobili.
È vero che esistono proxy ssl man-in-the-middle, ma il client avvertirà che il server con cui sta parlando non è riuscito a presentare un certificato valido (e se il client è un browser, non procedere).

Se la tua API Rest è configurata per ignorare i certificati SSL errati (e alcuni sono - lo so, ne ho scritto uno), allora, sì, un proxy MITM di ssl sarebbe effettivamente in grado di annusare le tue credenziali. Questo è intenzionalmente sovvertendo il protocollo SSL / TLS (non si può dire che si stia utilizzando SSL / TLS in questo caso).
Questo è il motivo per cui i certificati "autofirmati" sono solo a scopo di sviluppo e test.

    
risposta data 13.07.2015 - 19:02
fonte

Leggi altre domande sui tag