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".