2016-06-21 15 views
7

Ho un servizio in cui gli utenti dispongono di una chiave API. Devo memorizzare le chiavi in ​​modo che possano essere utilizzate per convalidare le richieste API.Memorizzazione chiavi API sul server

Se memorizzo le chiavi in ​​chiaro nel mio database, sono preoccupato per lo scenario di qualcuno che accede al db, che afferra tutte le chiavi di testo in chiaro, quindi le usa per impersonare gli altri (probabilmente ci saranno problemi più grandi se qualcuno ha avuto accesso al db, però).

Questo è simile a memorizzare le password degli utenti, dove basta memorizzare l'hash e convalidare utilizzando tale - tuttavia la maggior parte le API consentono di visualizzare le chiavi API, il che significa che devono essere conservati in qualche modo recuperabile.

Esiste una best practice per questo?

Grazie

risposta

4

La minaccia che qualcuno ottiene il database e ottiene le chiavi significa che possono utilizzare i tasti API per accedere ai dati nel database, che già hanno, in modo da non vincere lì.

La minaccia che qualcuno può accedere al database, ottenere le password, significa che possono riutilizzare quelle password su altri siti Web con lo stesso nome utente perché le persone tendono a riutilizzare le proprie password.

Un altro motivo per cui le password sono chiare o facilmente reversibili è che qualcuno nella tua azienda potrebbe ottenere una sospensione delle password e iniziare a fare cose cattive in qualità di utente. Quale è un rischio che potresti avere se le tue chiavi API sono in chiaro.

In genere, HMAC è una soluzione per il calcolo crittografico di un valore protetto da una singola chiave segreta e un valore pubblico.

Dai un'occhiata a HMAC. Con HMAC, puoi caricare una chiave segreta in memoria con l'app (file di configurazione, lettura di amazon KMS, digitato all'avvio dell'app, o comunque vuoi ottenere quella chiave segreta lì).

Nel database, memorizzare un token. Token = UUID() per esempio. Il token dovrebbe essere univoco per l'utente, il token potrebbe essere versionato nel caso in cui sia necessario rigenerare e il token potrebbe essere casuale (come UUID). Il token non è segreto.

La chiave API è calcolata utilizzando la chiave segreta (SK) e token utente (UT) come segue:

API_SECRET = HMAC(SK, UT) 

quindi distribuire che API_KEY e API_SECRET per l'utente, e quando l'utente tenta di collegarsi, si calcola la API_SECRET: record utente

  1. Get dal database (probabilmente stai già chiedendo all'utente di fornire il proprio nome utente)
  2. Calcola l'API_SECRET dal UT nel database:

    API_SECRET_DB = HMAC (SK, UT)

  3. Confrontare la calcolata API_SECRET_DB a quello previsto nella richiesta:

    se (API_SECRET_DB == API_SECRET_FROM_REQUEST) {// utente di accesso }

linea di fondo, è solo proteggere la chiave segreta, e non tutti i peccati credenziali.

+0

Perché non utilizzare semplicemente la chiave segreta del server per crittografare ogni chiave API? Quando la chiave API arriva su una richiesta, crittografala e confrontala con il valore crittografato memorizzato. Decifrare il valore memorizzato se è necessario visualizzare la chiave API. –

+0

HAMC è una crittografia unidirezionale comunemente utilizzata in questi tipi di scenari. Consideralo un tipo di crittografia, tranne per il fatto che è un modo per non poter decodificare i dati. – Jonathan

+0

L'OP ha chiesto informazioni sulla visualizzazione delle chiavi API. Per l'hashing a senso unico in cui non è necessario ripristinare l'originale, utilizzerei un hash per le password come bcrypt o scrypt, ad esempio per ottenere un allungamento e una salatura delle chiavi. –

Problemi correlati