2009-09-27 3 views

risposta

48

Quando un server riceve una chiamata API, ha bisogno di sapere due cose: chi sta facendo la chiamata, e se la chiamata è legittima.

Se hai appena avuto un elemento ("chiave"), e incluso con ogni chiamata, sarebbe rispondere a entrambe le domande. In base alla "chiave" il server sa chi sei e, poiché solo tu conosci la chiave, dimostra che la chiamata proviene effettivamente da te. Ma includere la chiave di ogni chiamata è una cattiva pratica di sicurezza: se qualcuno può leggere anche uno dei tuoi messaggi in transito, la tua chiave è compromessa e qualcuno può fingere di essere te stesso. Quindi, a meno che non utilizzi HTTPS, questo approccio non funziona.

Invece, è possibile includere una firma digitale con ogni chiamata, firmato con un certo numero di "segreto". (Il numero "segreto" di per sé non viene inviato). Se un utente malintenzionato riesce a leggere il tuo messaggio, non sarà in grado di capire questo numero "segreto" dalla firma. (Ecco come funzionano le firme digitali: sono a senso unico).

Ma questo non risolve il problema di identificazione: in quest'ultimo caso, come fa il server sapere che sta effettuando la chiamata? Potrebbe provare a verificare la firma rispetto al "segreto" di ogni singolo utente, ma ovviamente ciò richiederebbe molto tempo.

Quindi, ecco cosa facciamo: Invia sia una "chiave" (che identifica l'utente), sia una firma creata utilizzando il numero "segreto" (che dimostra che il messaggio è legittimo). Il server ricerca l'utente in base alla chiave e quindi convalida la firma utilizzando il numero "segreto" dell'utente.

Questo è un po 'come quando si scrive un assegno: Ha un numero di conto su di esso (per identificare l'utente) e la propria firma (per dimostrare che sei). Avere solo il numero di conto non proverebbe che in realtà hai scritto l'assegno. Avere solo la firma senza il numero di conto costringerebbe la banca a confrontare il tuo assegno con tutte le sue firme per tutti i suoi conti, il che ovviamente sarebbe inefficiente.

+5

è piuttosto esplicativo ma ancora un po 'confuso su cosa intendi con la firma con un numero segreto ?? – OrangeRind

+2

Vedere http://en.wikipedia.org/wiki/Digital_signature o, per un esempio di vita reale, http://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html. Essenzialmente, una possibilità è di calcolare una qualche funzione di hash della combinazione dell'API "segreto" e della stessa richiesta API (o delle parti più critiche di esso) - questa è la "firma". –

+2

non spiega ancora perché è necessaria un'altra chiave segreta quando tutte le comunicazioni sono in HTTPS. – opengrid