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


13

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

È possibile che un utente malintenzionato usi 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 suo PC (se aveva la sincronizzazione desktop abilitata) e sul PC di altri (se avevano cartelle condivise) e così via. : O

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

Ma vorrei sapere in generale come si nasconderebbero i dati riservati in un progetto open source.

Ho un'idea.

  • Hai un segnaposto nel codice sorgente come "<CHIAVE SEGRETA QUI>" e compilarlo solo quando si crea il binario per il rilascio? (che schifo!)

Qualche idea decente?


1
Questo è davvero l'unico modo sicuro per farlo. Potresti usare anche la crittografia pgp per codificare la tua chiave segreta, quindi solo tu potresti decodificarla, ma perché preoccuparti di pubblicarla.
Prescott,

Potrebbe voler dare un'occhiata a questa domanda: programmers.stackexchange.com/questions/180957/… - non si tratta di chiavi API DropBox, ma il messaggio generale è lo stesso.
martedì

git-crypt è stato creato per te :) github.com/AGWA/git-crypt
nha

Risposte:


14

L'idea di base è di NON effettuare il check-in dei valori riservati nel codice o nel file binario compilato. Soprattutto se il progetto è open source non dovresti davvero. Esistono diverse strategie di configurazione che è possibile adottare per farlo:

Segnaposto nel codice (valori codificati)

Segnaposto nel codice - come è stato suggerito - che è il più sano e semplice da fare nei linguaggi di programmazione dinamica poiché il codice è facile da modificare (senza bisogno di compilare). Ho visto molti progetti open source fare questo come MediaWiki con esso LocalSettings.php.

L' aspetto negativo di questa strategia è che la chiave è hardcoded. Pertanto, se il programma è distribuito come binario, la chiave codificata non lo rende particolarmente gestibile.

File di testo di configurazione

Puoi anche farlo implementando file di testo di configurazione , ad esempio il programma / l'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 propria macchina.

Nel tuo caso puoi creare un key.conffile di testo con la chiave effettiva, consentire al programma di utilizzare quel file e lasciarlo ignorare dal controllo della versione. Puoi, per essere utile, key.conf.examplearchiviare un file di testo con una chiave fasulla e controllarlo. Assicurati che il tuo programma / applicazione crei un utile messaggio di errore per l'utente di aggiungere la chiave effettiva nel file corretto.

Alcuni linguaggi di programmazione hanno API che ti forniscono questo automaticamente, come:

Se l'applicazione è un'app di database, quindi considerare 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 del database.

Tramite visualizzazione delle preferenze o un'app di Back Office

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

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

Certo, questa non è un'opzione per programmi che funzionano esclusivamente come processi, servizi o demoni in background. Tuttavia, è per questo motivo che crei progetti di GUI separati per creare un punto di accesso per le impostazioni di amministrazione e preferenze, nelle app Web di solito chiamate applicazioni Back Office .


Una cosa da notare qui: avere l'applicazione stessa modificare le proprie impostazioni di configurazione significa che il file delle impostazioni deve essere scrivibile dall'utente dell'applicazione, il che a sua volta aumenta la superficie di attacco, quindi dovresti pensare seriamente se hai davvero bisogno di una tale interfaccia utente.
martedì

2

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

  • Usa un segnaposto come nella domanda.
  • Utilizzare un file di intestazione appositamente per la chiave, non impegnarlo nel controllo del codice sorgente e distribuirlo solo privatamente a parti fidate.

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


2

Se qualcuno ha il codice sorgente (o il codice byte che può essere decodificato), allora saranno in grado di ottenere la chiave segreta eseguendo il codice in un debugger e mettendo 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 di drop box, con la chiave codificata in quella, ma ci sono ancora molti modi in cui le chiavi fuoriusciranno (sto pensando ad esempio le stringhe).

L'unico modo sicuro che posso pensare di fare questo, è quello di fornire un servizio web che esegua la pubblicazione nella casella di riepilogo. In questo modo la chiave segreta rimane sul tuo server sotto il tuo controllo. I costi di hosting e larghezza di banda indicano che questa soluzione è tutt'altro che ideale per un'applicazione gratuita, ma il vantaggio aggiuntivo è che il tuo server può autenticare correttamente i client prima di inoltrare i loro file inviati a dropbox.

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.