it-swarm.dev

Come devono essere generate le chiavi API?

Voglio assicurarmi che le richieste non possano essere forgiate 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à firmare le richieste sul lato client e convalidarle sul server.

La domanda è: di cosa sono generalmente costituite 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 dell'utente.

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

31
James

Dipende da quanto vuoi separare i ruoli.

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

Sistema avanzato: la tua firma è 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 molta struttura interna e ogni algoritmo implica uno specifico algoritmo di generazione delle chiavi. Utilizzare una libreria che implementa già i bit necessari (ad es. OpenSSL ).


In entrambi i casi, c'è di più oltre alla semplice generazione di chiavi e firme. Ad esempio, probabilmente vuoi evitare ripeti gli attacchi: spie di terze parti mal intenzionate sulla rete e registra una richiesta valida firmata da un utente normale. Successivamente, l'attaccante invia nuovamente la richiesta, completa della sua firma, in modo da replicare l'effetto. Per evitare attacchi replay, devi aggiungere una sorta di protocolli esterni e queste cose sono difficili da fare (non è difficile definire un protocollo; è molto difficile definire a secure protocollo). Pertanto, la cosa intelligente da fare è riutilizzare un protocollo esistente ben verificato, che, in pratica, significa SSL/TLS .

Con SSL, il "sistema di base" si riduce 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".

24
Thomas Pornin