Il modo migliore per nascondere la chiave API nel codice sorgente

12

Ho bisogno di alcune idee su come proteggere una chiave API privata in un'applicazione, in particolare in un'applicazione c # .NET.

In primo luogo, capisco che è teoricamente impossibile nascondere qualsiasi cosa nel codice sorgente, così mi è venuta in mente un'altra idea, ma non sono sicuro di quanto sia plausibile. In ogni caso, sarebbe possibile comunicare in qualche modo con un server web per verificare la chiave privata e poi rispondere all'applicazione per confermare che si tratta di un handshake legittimo?

Ho due chiavi su cui lavorare: una chiave pubblica (come suggerisce il nome, non deve essere trattata con la stessa cura del privato) e una chiave privata, che deve essere tenuta al sicuro dagli altri.

Qualche idea su come potrei farlo sarebbe molto apprezzata.

    
posta Spencer 05.02.2014 - 01:27
fonte

2 risposte

12

Per riassumere:

  • Hai una chiave API rilasciata da un venditore in modo che tu possa utilizzare la loro API e hai l'obbligo di impedire che questa chiave sia conosciuta da chiunque altro
  • Stai effettuando chiamate all'API del fornitore (che richiede la chiave API) nel codice dell'applicazione
  • Stai distribuendo l'applicazione ai sistemi in cui i clienti hanno accesso ai binari e quindi potrebbero potenzialmente decompilare / deobfuscare il codice o intercettare il traffico

Il modo migliore per evitare il compromesso di questa chiave è di mantenerne il controllo. Ciò significa che non dovrebbe mai essere distribuito su un server dove chiunque oltre a te potrebbe leggere il binario e non andare mai oltre un link di comunicazione che non controlli.

In definitiva, se i binari sono fuori dal tuo controllo, tutto ciò che li circonda è fuori dal tuo controllo. Allo stesso modo, se qualcuno può intercettare il traffico, può acquisire la chiave API ( potenzialmente anche se stai usando SSL ).

Riesco a vedere due modi principali per eseguire questa operazione, che non includono la chiave API privata nell'applicazione distribuita:

Ottieni una chiave API univoca per ogni distribuzione

Ciò richiederebbe una relazione aggiuntiva con il venditore, in cui è possibile ottenere le chiavi o chiedere ai clienti di ottenere le chiavi.

Questo è in realtà abbastanza comune con, ad esempio, i prodotti che utilizzano l'API di Google Maps. Il creatore del software ha la propria chiave che utilizza durante lo sviluppo / esecuzione della copia, ma non lo include nel software e, invece, richiede all'utente, come utente che installa detto software, di andare su Google e ottenere la propria API chiave. Il software ha semplicemente un'opzione di configurazione per impostare la chiave dell'API di Google Maps da utilizzare.

In effetti, molti fornitori che emettono per contratto chiavi API richiedono che tu faccia le cose in questo modo, quindi potresti anche essere sulla strada sbagliata, e questa potrebbe essere l'unica soluzione che puoi utilizzare in base ai termini del venditore di servizio e / o eventuali contratti legali che potresti avere con loro.

Utilizza un proxy

Imposta un'API proxy, in cui l'applicazione chiama l'API (sui tuoi server) e, a sua volta, l'API chiama l'API del fornitore utilizzando la chiave.

Potrebbe essere necessaria una protezione aggiuntiva sull'API, ad esempio, per garantire che solo l'applicazione la stia utilizzando. Questo potrebbe essere fatto da:

  • rendendo la funzionalità così specifica nient'altro che la tua app possa utilizzarla
  • Whitelist IP
  • Alcuni meccanismi di autorizzazione / autorizzazione già in uso per i tuoi server
  • Il tuo sistema di chiavi API in cui puoi inviare le chiavi ai tuoi clienti

La cosa da tenere a mente qui è che potresti non essere autorizzato a farlo. Il tuo fornitore potrebbe avere Termini di servizio o contratti legali che ti impediscono di creare un "servizio di aggregazione" o un proxy, quindi devi verificarlo.

Gestione del comportamento scorretto

Anche se la tua chiave non viene compromessa, se uno dei tuoi clienti sta facendo qualcosa che impedisce al venditore di bloccare la tua chiave, improvvisamente TUTTI i tuoi clienti sono disabilitati e l'unica soluzione è aggiornare tutti gli altri.

Allo stesso modo, se tu vuoi bloccare uno dei tuoi clienti (ad esempio, hanno smesso di pagare, hanno piratato il software, ecc.) allora non puoi farlo senza rilasciare un aggiornamento a tutti gli altri, e quindi disabilitando la chiave.

La logistica di questo per qualcosa al di là di una manciata di clienti diventerà presto insostenibile.

Sia che tu operi come proxy o che disponga di una chiave univoca per ogni installazione, puoi gestire una qualsiasi di queste situazioni in modo relativamente semplice (e con poco o nessun impatto su nessun altro).

Cercare di proteggere la chiave mentre è integrata nel software è in definitiva uno sforzo inutile. Qualunque cosa tu faccia, qualsiasi attaccante che abbia accesso ai binari, alla sorgente e / o al canale di comunicazione e sia determinato a sufficienza per ottenere la chiave, sarà in grado di farlo.

Quindi non incorporarlo. "L'unica mossa vincente è non giocare."

    
risposta data 05.02.2014 - 18:35
fonte
4

Se hai una chiave nel codice oggetto, è pubblica per definizione. Ci sono hack attorno agli obfuscator che decompilano rapidamente il codice oggetto. Una chiave privata sarebbe al di fuori del codice oggetto e in un altro file. La parte difficile è fornire questa chiave privata all'utente. Una volta fornito, è possibile utilizzare una firma della chiave privata, attaccata alla fine del file e una chiave pubblica all'interno dell'applicazione, per verificare l'integrità della chiave privata. Un server web può anche fare questa verifica, se hai un canale di comunicazione sicuro.

    
risposta data 05.02.2014 - 01:43
fonte

Leggi altre domande sui tag