2012-06-14 15 views
6

Ho un servizio Web che sto offrendo agli utenti per accedere al mio database delle applicazioni e ottenere alcune informazioni. Gli utenti devono registrarsi per una chiave API e fornire tale richiesta. Tutto funziona bene, ma come faccio a verificare se gli utenti che si sono registrati per una chiave stanno effettivamente facendo la richiesta e non qualcun altro a cui potrebbe aver dato la chiave?Servizio Web REST e chiavi API

Ho pensato per gli ultimi due giorni a trovare una soluzione, ma nulla finora.

+0

Usi JAVA o PHP (o qualsiasi altra cosa)? – sp00m

+0

lingua lato server è PHP – slash197

+0

Come ha risposto @Laurent, è possibile dare un'occhiata al processo OAuth, ma proporrei l'OAuth2. Anche se il post è un po 'vecchio, troverai [qui] (http://stackoverflow.com/q/4875420/1225328) un'implementazione PHP di quel meccanismo. PS: Google e Facebook utilizzano entrambi OAuth2 per consentire agli sviluppatori di comunicare con le loro API. – sp00m

risposta

10

È necessario utilizzare le richieste firmate. In pratica funziona così:

  • si dà l'utente un'API chiave e un "segreto" (una stringa casuale) che solo tu e il cliente sa.
  • Ogni volta che fanno una richiesta, aggiungono un parametro "firma" ad esso. Questa firma è fondamentalmente un hash dei parametri della richiesta + la chiave API + altri parametri (vedi sotto) + il segreto.
  • Poiché si conosce anche il segreto, è possibile verificare che la firma sia corretta.

Per evitare attacchi di replay, è anche possibile aggiungere noces e timestamp nel mix. Un nonce è semplicemente un numero che deve essere incrementato dal client per ogni richiesta. Quando ricevi la richiesta, controlli se hai già ricevuto questo nonce/timestamp prima. Se lo hai fatto, respingi la richiesta (perché è più probabile un attacco di riproduzione). Altrimenti, memorizzi il nonce/timestamp nel tuo database in modo che tu possa cercarlo in seguito.

Questo è più o meno come le richieste sono firmati in OAuth. Dai un'occhiata al loro esempio nel link.

+0

Grazie! Sembra interessante, devo verificarlo. – slash197

+0

Se l'utente consegna la sua chiave segreta, non è comunque possibile verificare la propria identità. La politica (e non la tecnologia) deve dettare l'uso appropriato della chiave API e della chiave segreta. Tuttavia, questa è una buona notizia. In quale scenario si applicherà un attacco di replay: sniffing del traffico (chiave/parametri API) o indovinando i parametri della richiesta? – KyleM

+0

@KyleM, sì è per prevenire gli attacchi MITM. Immagino sia meno importante se la connessione è su https (come dovrebbe essere). –

2

Ci sono 2 parti per l'autenticazione delle chiamate API REST. Quando un utente si registra con il tuo servizio, in genere assegnerai una CHIAVE che identifica quell'utente. A volte, questo è sufficiente. Ma questa CHIAVE può essere condivisa o rubata. In tal caso, il tuo servizio considererà la chiave ancora valida. Ora, al fine di prevenire i dirottamenti dei tasti ecc., Distribuirai anche una chiave segreta. Questa chiave non viene mai trasportata con la richiesta dell'API REST. Questa chiave viene utilizzata per eseguire un hash unidirezionale della richiesta API e creare una firma (HMAC).

Questa firma, oltre alla richiesta API (richiesta HTTP in forma di URL) viene poi inviato al server API. Il server esegue l'hash unidirezionale dell'URL e si confronta con la firma utilizzando la chiave privata di questo utente. Se corrispondono, è "assunto" che il richiedente abbia accesso alla chiave privata, e quindi la richiesta è valida.

Al fine di evitare gli attacchi di riproduzione, oltre a nonce (come suggerito dal poster precedente), si può anche utilizzare hash concatenamento.