Le risposte a questa domanda Va bene che il segreto dell'API sia memorizzato in testo normale o decrypt-able? sono alquanto inquietanti per me. Sto provando a pensare a come la memorizzazione di una chiave segreta in chiaro sia in ogni modo sicura.
Questo è il modo in cui immagino che un sistema basato su chiave di accesso API / chiave segreta funzioni:
- Il client accetta il testo della richiesta e applica la funzione HMAC con
secretKey
, risultando insignature
- Il cliente aggiunge
signature
eaccessKey
a richiesta (efficacemente come intestazioni di autenticazione) e invia al server - Il server estrae
accessKey
dalla richiesta e cercaserverSecretKey
corrispondente - Il server accetta il testo della richiesta e applica la funzione HMAC con la versione del server di
serverSecretKey
, risultando inserverSignature
- Server confronta
signature
aserverSignature
; se corrispondono, ottimo, siamo bravi - sappiamo che il client ha sia una chiave di accesso valida che una chiave segreta valida
Quindi, prima di andare avanti, se quanto sopra non è corretto, il resto di questa domanda sarà più o meno priva di significato, quindi per favore fatemi sapere se la comprensione di API / chiavi segrete di cui sopra è valida o meno: - )
Supponendo che la mia comprensione sia valida - la mia domanda ritorna su come è memorizzata la chiave segreta - è che deve essere memorizzata in testo in chiaro affinché il sistema sopra possa funzionare.
Quindi cosa succede se un utente malintenzionato accede al mio database con le chiavi di accesso API e le chiavi segrete di tutti i miei clienti? Non sarebbero facilmente in grado di utilizzare qualsiasi combinazione di accesso / chiave segreta che preferiscono e impersonare felicemente qualsiasi cliente?
Sto osservando questo dal punto di vista delle password bcrypt
. Se un utente malintenzionato accede a un database con un intero gruppo di password bcrypt
, ha un sacco di lavoro in anticipo per rendere quel database utile a loro, dal momento che impone un set di forzanti a un set le password di bcrypt
sono computazionalmente costose. Ciò sembra molto più sicuro rispetto alla memorizzazione di chiavi API segrete in testo in chiaro in un database da qualche parte.
Sembra che una combinazione di chiave di accesso API / chiave segreta fornisca realmente solo una protezione contro la manomissione di un messaggio (poiché la firma digitale calcolata durante i passaggi 1 e 2 è legata alla chiave segreta) e non veramente fornire alcuna garanzia che il cliente è chi dicono di essere. Non vedo come fornisce un livello di sicurezza paragonabile alle password di bcrypt
.
Cosa mi manca qui?