Come è possibile memorizzare una chiave segreta API in testo semplice (in un database) sicura?

14

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:

  1. Il client accetta il testo della richiesta e applica la funzione HMAC con secretKey , risultando in signature
  2. Il cliente aggiunge signature e accessKey a richiesta (efficacemente come intestazioni di autenticazione) e invia al server
  3. Il server estrae accessKey dalla richiesta e cerca serverSecretKey corrispondente
  4. Il server accetta il testo della richiesta e applica la funzione HMAC con la versione del server di serverSecretKey , risultando in serverSignature
  5. Server confronta signature a serverSignature ; 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?

    
posta Rob 07.07.2013 - 16:32
fonte

3 risposte

6

Il tuo pensiero su questo è troppo bianco e nero: sicuro o pericoloso. Non c'è sicurezza qui, solo uno spettro di rischi.

Le aziende che forniscono queste API stanno effettuando una valutazione e stanno cercando di bilanciare il rischio con le prestazioni. Non tutte queste chiamate API devono avvenire su SSL. Pensa a caricare un'immagine su S3, ha bisogno di essere crittografata? Probabilmente no. Il requisito fondamentale è che le chiamate siano autenticate e autorizzate . Pensa a un milione di chiamate distinte a SDB o SQS, quanto sovraccarico sul lato client e server creerà SSL? Fondamentalmente SHA2 è veloce e costoso SSL, ora moltiplicato per 1.000.000.

Esiste il rischio di mantenere le chiavi API in chiaro sul lato server? Certamente, ma queste aziende stanno facendo una scommessa sul fatto che possono mettere altre mitigazioni intorno a quei negozi chiave che riducono il rischio a un livello accettabile. (In ultima analisi, se accedo al tuo keystore, hash o testo in chiaro, ci sono diverse cose maligne che posso fare come scambiare la mia chiave segreta con la tua.)

Informazioni sulla tua affermazione: "in realtà non fornisce alcuna garanzia che il cliente sia chi dice di essere"

Questo è vero per quasi tutti gli schemi di autenticazione. Se qualcuno accede a questo sito con il mio nome utente e password, non dimostra che sono io, solo che possiedono le mie credenziali. Se qualcuno usa la mia impronta digitale per sbloccare un lucchetto biometrico, indica che hanno un modo di fornire il mio impronta digitale in un modo che il lucchetto accetterà. Ciò che cambia qui è quanto sia difficile. Rubare le credenziali potrebbe non essere così difficile, impersonare le impronte digitali è probabilmente più difficile ma non impossibile.

    
risposta data 08.07.2013 - 17:29
fonte
4

In breve non lo è, tuttavia la chiave segreta non ha necessariamente bisogno di essere archiviata in chiaro sul server. Potrebbe essere crittografato (ma non hash come altri hanno spiegato) con informazioni che fanno parte di una richiesta del cliente.

Allo stesso modo, se accedi a un servizio che visualizza le tue chiavi segrete, le chiavi non devono essere state salvate in chiaro in quanto potrebbero essere crittografate con una derivata unidirezionale della password che è stata utilizzata per accedere e che viene mantenuta associata con la sessione. Mentre è possibile scoprire la chiave segreta in caso di accesso ai dati della sessione, solo un sottoinsieme di chiavi segrete del client potrebbe essere a rischio in qualsiasi momento.

    
risposta data 07.07.2013 - 18:05
fonte
2

Recentemente ho aggiunto una risposta all'altra domanda che penso sia rilevante anche qui. Ho modificato leggermente la mia risposta per indirizzare più direttamente la tua domanda:

C'è un'altra importante differenza tra una chiave API e una password. Le API Key sono uniche per il tuo sito. La parte che rende la sicurezza delle password così importante è la condivisione delle password. Se qualcuno ottiene una sospensione della password che un utente ha salvato sul tuo sito, non è solo il tuo sito a essere compromesso: è ogni altro sito che l'utente ha utilizzato per tale password (e email / nome utente).

Una chiave API è uno scenario completamente diverso perché è univoco per il tuo sito. Di conseguenza, se viene rubato, l'attaccante ottiene l'accesso al tuo sito, ma non guadagna nulla che possa fare leva sulla banca / email / etc di quella persona. Ciò significa che le chiavi API sono più simili agli identificatori di sessione che alle password.

Dal punto di vista della sicurezza, esaminerai il problema in modo più chiaro se pensi alle chiavi API non come password ma come ID di sessione, specialmente nei casi in cui le chiavi API possono essere assegnate automaticamente (OAuth e simili). Sì, le chiavi API possono essere rubate e il tuo account potrebbe essere compromesso, ma i modi in cui le chiavi sono vulnerabili a essere rubate sono molto diverse da quelle in cui una password può essere rubata. In particolare, una password è (teoricamente) memorizzata solo in due punti: la testa dell'utente e il tuo database. Di conseguenza il tuo database è la più grande minaccia alla sicurezza delle password (se ignoriamo gli attacchi di phishing), e il riutilizzo delle password rende il pericolo reale per gli utenti molto alto nel caso in cui il tuo database venga rubato con password in puro testo.

Tuttavia, nel caso di un identificativo di sessione o di una chiave API, nessuna di queste analisi è vera. Le chiavi API sono memorizzate nel tuo database, ma sono anche memorizzate in qualunque client stia utilizzando la password. Questo potrebbe essere nella memoria di un'applicazione javascript front-end (che è vulnerabile agli attacchi XSS), un file di configurazione su un server che si sta integrando con l'API (che è vulnerabile a un set di attacchi completamente diverso) o che sa dove altro. Di conseguenza, il database non è più il vettore di attacco principale da cui accedere alle chiavi API. Questo sicuramente cambia le priorità di sicurezza.

Per fare un altro punto, gli identificatori di sessione sono la prospettiva giusta per visualizzare le chiavi API. Qualsiasi sito web che fa affidamento sulle sessioni per archiviare i dati utente di solito ha un ID di sessione che viene anche memorizzato nel database e memorizzato in un cookie con il browser dell'utente. Di conseguenza, se il tuo database è compromesso e scaricato, le sessioni dell'utente sono completamente compromesse. Un utente malintenzionato potrebbe acquisire un ID di sessione, modificare i cookie per il tuo sito Web e accedere come qualsiasi utente senza alcuno sforzo. Gli hasht di sessione di hashing prima di archiviarli nel database arresterebbero questo particolare attacco, ma non farebbero nulla per fermare gli attacchi XSS che sono più comunemente usati per rubare le sessioni.

    
risposta data 12.07.2017 - 20:18
fonte

Leggi altre domande sui tag