Come devono essere generate le chiavi API?

31

Voglio assicurarmi che le richieste non possano essere falsificate e inviate al mio server. Per fare questo ho bisogno di generare una chiave API per utente sul mio sistema. Lo scopo della chiave sarà quello di firmare le richieste sul lato client e amp; convalidarli sul server.

La domanda è: in cosa consistono generalmente le chiavi API? Sono solo un numero casuale crittograficamente sicuro (simile a una password salt)? O c'è qualche logica dietro di loro, ad es. dovrebbero essere costituiti da dati specifici per l'utente.

Nel mio sistema ogni utente ha già un ID univoco (GUID) che non è esposto pubblicamente, potrei usare questa come "chiave" o una chiave API dovrebbe differire da un ID utente?

    
posta James 05.09.2012 - 23:34
fonte

1 risposta

24

Dipende da quanto vuoi separare i ruoli.

Sistema di base: la tua "firma" è un MAC . La "chiave API" è un valore segreto con la condivisione tra il server e l'utente. Algoritmi MAC normali come HMAC possono utilizzare sequenze arbitrarie di bit come chiave, quindi una chiave è facilmente generata utilizzando /dev/urandom ( Linux, * BSD, MacOS X), chiamando CryptGenRandom() (Win32) o utilizzando java.security.SecureRandom (Java).

Sistema avanzato: la tua firma è una vera firma digitale . Ciò ha senso se si desidera separare il generatore di chiavi (che può produrre chiavi che saranno accettate dal server) dal server stesso (che convalida le firme in arrivo). Le chiavi per gli algoritmi di firma sono oggetti matematici con molte strutture interne e ogni algoritmo implica un algoritmo specifico per la generazione di chiavi. Utilizza una libreria che già implementa i bit necessari (ad es. OpenSSL ).

In ogni caso, c'è dell'altro oltre alla semplice generazione e firma delle chiavi. Ad esempio, probabilmente si desidera evitare replay attack : una terza parte malintenzionata spia sulla rete e registra una richiesta valida firmata da un utente normale. In seguito, l'utente malintenzionato invia nuovamente la richiesta, completa con la sua firma, in modo da replicare l'effetto. Per evitare attacchi di replay, devi aggiungere una sorta di protocolli esterni, e queste cose sono difficili da fare (non è difficile definire un protocollo, è molto difficile definire un sicuro protocollo). Pertanto, la cosa intelligente da fare è il riutilizzo di un protocollo esistente e ben controllato, che, in pratica, significa SSL / TLS .

Con SSL, il "sistema di base" viene ridotto all'invio della chiave API in un'intestazione all'inizio della conversazione (è esattamente ciò che accade con l'autenticazione della password sui siti Web HTTPS). Il "sistema avanzato" è quindi "SSL con un certificato client".

    
risposta data 06.09.2012 - 00:00
fonte

Leggi altre domande sui tag