Come posso nascondere i dati riservati nel mio progetto open source?

13

Ho un progetto open source che carica i file su DropBox tra diversi host di file. In questo momento sto raschiando schermo per DropBox. Per utilizzare la loro API, devo codificare un SECRET KEY fornito da loro per l'autenticazione OAuth. Ma temo che la chiave non sia segreta se è visibile chiaramente a chiunque.

È "possibile" che qualcuno usi maliziosamente la mia chiave per caricare un virus sull'account di un utente (che ha già consentito l'accesso alla mia app) che si diffonderà sul proprio PC (se la sincronizzazione desktop è abilitata) e ad altri " pc (se avessero condiviso le cartelle) e così via. : O

Ho trovato questa domanda senza risposta che ha lo stesso problema del mio.

Ma mi piacerebbe sapere in generale come nascondere i dati riservati in un progetto open source.

Ho un'idea.

  • Avere un segnaposto nel codice sorgente come "< SECRET KEY HERE >" e riempirlo solo quando si costruisce il binario per il rilascio? (Bleah!)

Qualche idea decente?

    
posta Vigneshwaran 30.12.2012 - 09:03
fonte

3 risposte

14

L'idea di base è che tu NON controlli i valori riservati nel codice o nel file binario compilato. Soprattutto se il progetto è open source, davvero non dovresti. Esistono diverse strategie di configurazione che puoi adottare per fare ciò:

Segnaposto nel codice (valori hardcoded)

Segnaposto nel codice - come suggerito - che è la più sana e semplice da fare nei linguaggi di programmazione dinamici poiché il codice è facile da modificare (senza bisogno di compilare). Ho visto un sacco di progetti open source come MediaWiki con il suo LocalSettings.php .

Il lato negativo di questa strategia è che la chiave è hardcoded. Quindi se il programma è distribuito come binario, avere la chiave codificata non lo rende particolarmente mantenibile.

File di testo di configurazione

Puoi farlo anche implementando file di testo di configurazione , ovvero il programma / applicazione cerca un file di configurazione e legge i valori da esso. È possibile effettuare il check-in di una configurazione di esempio con segnaposto ma avere la configurazione effettiva locale nella macchina.

Nel tuo caso puoi creare un file di testo key.conf con la chiave effettiva, lasciare che il programma usi quel file e lasciarlo ignorare dal controllo di versione. Puoi, per essere d'aiuto, controllare un file di testo key.conf.example con una chiave falso e controllare l'ingresso. Assicurati che il tuo programma / applicazione invii un messaggio di errore utile per l'utente di aggiungere la chiave effettiva nel file corretto.

Alcuni linguaggi di programmazione dispongono di API che forniscono questo automaticamente per te, come ad esempio:

Se la tua applicazione è un'app di database, considera di inserire la chiave o altre variabili di configurazione nel database. È lo stesso del file di testo di configurazione sopra, ma metti invece tutte le variabili di configurazione come la chiave in una tabella di database.

Attraverso la visualizzazione delle preferenze o un'app di back office

Se il programma è una finestra o un'applicazione web con viste, è anche possibile consentire all'applicazione di creare il file di configurazione, attraverso una vista delle preferenze di sorta. In questo modo non è necessario controllare un file di configurazione di esempio come suggerito sopra.

MediaWiki ha risolto questo problema in modo simile generando automaticamente il file LocalSettings.php in un processo di installazione iniziale.

Ammettiamo che questa non è un'opzione per i programmi eseguiti esclusivamente come processi, servizi o demoni in background. Comunque è per questo che crei progetti GUI separati per creare un punto di ingresso per le impostazioni di amministrazione e preferenze, in applicazioni web solitamente chiamate Back Office application .

    
risposta data 30.12.2012 - 10:04
fonte
2

Il modo più semplice è semplicemente non pubblicare dati riservati. Alcune opzioni:

  • Utilizza un segnaposto come nella domanda.
  • Utilizza un file di intestazione appositamente per la chiave, non impegnarlo per il controllo del codice sorgente e distribuiscilo solo privatamente a parti fidate.

Ho usato la seconda opzione per lo sviluppo open source perché significa che non devi preoccuparti di inserire i dettagli prima della compilazione, o di avere una modifica da ricordare per non commettere.

    
risposta data 30.12.2012 - 09:50
fonte
2

Se qualcuno ha il codice sorgente (o codice byte che può essere decodificato), sarà in grado di ottenere la chiave segreta eseguendo il codice in un debugger e inserendo un punto di interruzione nel punto in cui si invia la chiave .

Puoi renderlo un po 'più difficile fornendo una libreria C precompilata che parla con drop box, con la chiave codificata in questo, ma ci sono ancora molti modi in cui le chiavi si diffonderanno (sto pensando ad esempio ad esempio le stringhe) ).

L'unico modo sicuro in cui posso pensare di fare questo, è di fornire un servizio web che fa la pubblicazione di lasciare la scatola. In questo modo la chiave segreta rimane sul tuo server sotto il tuo controllo. I costi di hosting e larghezza di banda significano che questa soluzione non è l'ideale per un'applicazione gratuita, ma il vantaggio aggiuntivo è che il tuo server può autenticare correttamente i client prima di inoltrare i loro file a Dropbox.

    
risposta data 30.12.2012 - 13:46
fonte

Leggi altre domande sui tag