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."