2011-02-08 7 views
8

La mia applicazione raggiunge una serie di servizi Web, come Twitter e Flickr. Usa le chiavi API di quei servizi e mi piacerebbe confonderli nei miei binari. (Non sono molto preoccupato per la pirateria o altro, ho solo bisogno di tenere segrete queste chiavi.)Come proteggere una chiave API in un'applicazione .NET

Qual è il modo migliore per farlo?

Se li memorizzo come const SecureString, ciò li mantiene fuori dalla memoria? La descrizione MSDN dice che il testo è "cancellato dalla memoria del computer quando non è più necessario", ma non è un const sempre in memoria?

Dotfuscator lo oscurerà nella mia assemblea? (Supponendo che posso farlo a work.)

+2

Non è possibile. Se un utente malintenzionato vuole la tua chiave API, l'offuscamento del tuo binario non gli impedirà di accedervi. Chiunque altro non saprebbe cosa fare con la chiave comunque. –

+0

Penso che SecureString aggraverebbe la situazione. Dal momento che è un grande cartello che dice "Guardami sono così segreto".SecureString protegge da cose come lo scambio di una chiave sul disco ma non contro un uso dannoso. – CodesInChaos

+0

E anche la semplice intercettazione della tua richiesta http su Twitter dovrebbe essere banale. – CodesInChaos

risposta

4

Anon è corretto, non c'è modo di proteggere completamente i dati; qualcuno può sempre farlo.

Ma tu vuoi renderlo il più difficile possibile. Questo non significa fare le cose che lo rendono facile da leggere:

  • non immagazzinare in una chiave del Registro di sistema (ad es TwitterAPIKey REG_SZ)
  • non memorizzare in un file di testo (ad esempio twitterkey.txt), o in un file ini
  • non memorizzare nel file config dell'applicazione
  • non memorizzare come testo normale nel binario
  • non memorizzare in chiaro nel binario

Questo lascerà le persone che devono avere conoscenza di un debugger e (possibilmente) codice assembly.

Hai ridotto la superficie di attacco molto.

Segui solo i primi tre suggerimenti e sarai sulla buona strada.

8

Recentemente ho dovuto affrontare esattamente questa situazione. Il problema non è tanto quello di assicurarsi che qualcuno non possa trovarlo facilmente usando un editor esadecimale, ma piuttosto quando viene inviato via cavo alle varie API. È sufficiente eseguire il violinista e osservare le richieste mostrerà la chiave a prescindere. Alcune API avranno il vantaggio di una chiave privata/pubblica che aiuta un po '.

L'unica soluzione che potevo trovare era creare un servizio web del mio host esterno che fungesse da proxy tra il client e l'API di destinazione. Ciò mi ha permesso di generare chiavi individuali per ogni terminale che potevo attivare/disattivare e la maggior parte dei dati sensibili era archiviata sulla mia applicazione proxy remoto.

Buona fortuna!

~ "Dont't dimenticare di bere l'Ovaltine"

+0

è possibile pubblicare alcuni esempi di codice per la soluzione? o spiegando di più come funziona – Smith

0

forse si può chiedere al proprio utente per utilizzare le proprie chiavi API. Possono registrarsi all'apis e quindi fare riferimento alla propria chiave nelle impostazioni della propria app

+0

Questo sarebbe un non-starter per le app mobili –