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 nell'applicazione ac # .NET.

In primo luogo, capisco che è teoricamente impossibile nascondere qualcosa nel codice sorgente, quindi ho avuto un'altra idea, ma non sono sicuro di quanto sia plausibile. Ad ogni modo, sarebbe possibile in qualche modo comunicare con un server Web per verificare la chiave privata e quindi rispondere all'applicazione per confermare che si tratta di una stretta di mano legittima?

Ho due chiavi con 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 protetta dagli altri.

Qualsiasi idea su come potrei farlo sarebbe molto apprezzata.


4
Stai cercando di impedire a qualcuno che ha accesso a un'applicazione binaria distribuita di leggere la chiave (come suggerisce il titolo) o di proteggerli dalla modifica (come implica l'idea di verificare tramite server)? Qual è l'obiettivo finale finale?
Gregreg

3
Può essere utile delineare il concetto di chiave API per i lettori che non hanno familiarità con esso. Una chiave API è un segreto assegnato allo sviluppatore di alcuni software che interagiscono con un servizio (in genere un servizio Web). Viene utilizzato per identificare l'origine del traffico, aumentare le restrizioni rispetto agli accessi anonimi e fatturare al proprietario della chiave per l'utilizzo del servizio. Dovresti tenerlo moderatamente nascosto e preferibilmente revocarlo se è compromesso. Poiché deve essere comunicato per intero al servizio, perdi sempre.
Lars Viklund,

@gregmac Sì, sto cercando di impedire agli utenti terzi dell'applicazione di leggere la chiave.
Spencer,

Non metterlo lì
CodeART

Risposte:


13

Riassumere:

  • Hai una chiave API emessa da un fornitore in modo da poter utilizzare la sua API e hai l'obbligo di impedire che questa chiave venga conosciuta da chiunque
  • Stai effettuando chiamate all'API di quel fornitore (che richiede la chiave API) nel codice dell'applicazione
  • Stai distribuendo l'applicazione su sistemi in cui i clienti hanno accesso ai file binari e quindi potrebbero potenzialmente decompilare / deobfuscare il codice o intercettare il traffico

Il modo migliore per prevenire la compromissione di questa chiave è mantenerne il controllo. Ciò significa che non dovrebbe mai essere distribuito su un server in cui chiunque oltre a te possa leggere il binario e non passare mai su un collegamento di comunicazione che non controlli.

Alla fine, se i binari sono fuori dal tuo controllo, tutto ciò che è in essi è fuori dal tuo controllo. Allo stesso modo, se qualcuno può intercettare il traffico, può acquisire la chiave API ( potenzialmente anche se si utilizza SSL ).

Riesco a vedere due modi principali per ottenere questo risultato, entrambi i quali non includono la chiave API privata nell'applicazione distribuita:

Ottieni una chiave API unica per ogni distribuzione

Ciò richiederebbe qualche relazione aggiuntiva con il fornitore, in cui è possibile ottenere le chiavi o fare in modo che i clienti ottengano le chiavi.

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

In effetti, molti fornitori che rilasciano chiavi API contrattualmente richiedono di fare le cose in questo modo, quindi potresti anche essere sulla strada sbagliata in ogni caso, e questa potrebbe essere l'unica soluzione che ti è consentito utilizzare in base ai Termini di servizio del fornitore e / o eventuali contratti legali che potresti avere con loro.

Usa 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 qualcosa per garantire che solo l'applicazione lo stia utilizzando. Questo potrebbe essere fatto da:

  • rendendo la funzionalità così specifica nulla ma la tua app può usarla
  • Whitelist IP
  • Alcuni meccanismi di licenza / autorizzazione esistenti che già possiedi per i tuoi server
  • Il tuo sistema di chiavi API in cui puoi emettere chiavi per i 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 proxy, quindi devi verificarlo.


Gestire comportamenti scorretti

Anche se la tua chiave non viene compromessa, se uno dei tuoi clienti sta facendo qualcosa che causa il blocco della chiave da parte del fornitore, improvvisamente TUTTI i tuoi clienti vengono disabilitati e l'unica soluzione è aggiornare tutti gli altri.

Allo stesso modo, se si desidera bloccare uno dei vostri clienti (ad esempio, hanno smesso di pagare, hanno piratato il software, ecc), allora non si può fare senza l'emissione di un aggiornamento a tutti gli altri, e quindi disabilitando la chiave.

La logistica di questo per qualsiasi cosa oltre una manciata di clienti diventerà rapidamente insostenibile.

Sia che tu agisca 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 un impatto minimo o nullo per chiunque altro).


Cercare di proteggere la chiave mentre è incorporata nel tuo software è in definitiva uno sforzo inutile. Indipendentemente da ciò che fai, qualsiasi utente malintenzionato che ha accesso ai binari, alla sorgente e / o al canale di comunicazione ed è abbastanza determinato da ottenere la propria chiave sarà in grado di farlo.

Quindi non incorporarlo. "La sola mossa vincente è non giocare."


2
+1 per "Ottieni una chiave API univoca per ogni distribuzione." Potrebbe anche essere usato insieme al proxy, dandoti la possibilità [limitata] di disabilitare chiavi / client cattivi.
svidgen,

@svidgen Ottimo punto, ho aggiunto una sezione che ne discute. Grazie.
Gregreg

1
+1, una chiave universale quasi invariabilmente ti morderà nel ***
Wyatt Barnett,

Risposta molto approfondita. Sfortunatamente, mi è stata assegnata una sola chiave API privata, quindi non è possibile chiedere all'utente di recuperare una chiave, poiché sono sotto NDA con i protocolli di rete, quindi il motivo di una chiave privata. Il proxy probabilmente è anche fuori questione. Potrei semplicemente ricorrere a trasformarlo in qualche modo in un formato leggibile non umano e metterlo da qualche parte nella fonte - non è una grande opzione, ma non sono rimaste molte opzioni.
Spencer,

5

Se hai una chiave nel codice oggetto, è pubblica per definizione. Ci sono hack intorno agli offuscatori che decompongono rapidamente il codice oggetto. Una chiave privata si troverebbe all'esterno 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, incollata alla fine del file e una chiave pubblica all'interno dell'applicazione, per verificare l'integrità della chiave privata. Un server Web può anche effettuare questa verifica, se si dispone di un canale di comunicazione sicuro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.