Comment masquer des données confidentielles dans mon projet open source?

13

J'ai un projet open source qui télécharge des fichiers vers DropBox parmi plusieurs hôtes de fichiers. En ce moment, je gratte l'écran pour DropBox. Pour utiliser leur API, je dois coder en dur une CLÉ SECRETE qu'ils m'ont fournie pour l'authentification OAuth. Mais je crains que la clé ne soit pas secrète si elle est clairement visible pour tout le monde.

Il est «possible» pour une personne malveillante d'utiliser ma clé pour télécharger un virus sur le compte d'un utilisateur (qui a déjà autorisé l'accès à mon application) qui se propage sur son PC (si la synchronisation de bureau est activée) et sur le PC des autres (si ils avaient partagé des dossiers) et ainsi de suite. : O

J'ai trouvé cette question sans réponse qui a le même problème que la mienne.

Mais je voudrais savoir de manière générale comment on pourrait cacher des données confidentielles dans un projet open source.

J'ai une idée.

  • Avoir un espace réservé dans le code source comme "<CLÉ SECRET ICI>" et le remplir uniquement lors de la construction du binaire pour publication? (beurk!)

Une idée décente?

Vigneshwaran
la source
1
C'est vraiment le seul moyen sûr de le faire. Vous pouvez également utiliser le cryptage pgp pour coder votre clé secrète, alors seulement vous pouvez la décoder, mais pourquoi vous embêter à la publier.
Prescott
Pourrait vouloir vérifier cette question: programmers.stackexchange.com/questions/180957/… - il ne s'agit pas de clés API DropBox, mais le message général est le même.
tdammers
git-crypt a été fait pour vous :) github.com/AGWA/git-crypt
nha

Réponses:

14

L'idée de base est de ne PAS archiver des valeurs confidentielles dans le code ou dans le binaire compilé. Surtout si le projet est open source, vous ne devriez vraiment pas. Pour ce faire, vous pouvez adopter plusieurs stratégies de configuration:

Espaces réservés dans le code (valeurs codées en dur)

Les espaces réservés dans le code - comme cela a été suggéré - ce qui est le plus sain et le plus facile à faire dans les langages de programmation dynamiques car le code est facile à changer (sans avoir besoin de le compiler). J'ai vu beaucoup de projets open source faire cela, comme MediaWiki avec LocalSettings.php.

L' inconvénient de cette stratégie est que la clé est codée en dur. Donc, si le programme est distribué sous forme binaire, le fait d'avoir la clé codée en dur ne le rend pas particulièrement maintenable.

Fichiers texte de configuration

Vous pouvez également le faire en implémentant des fichiers texte de configuration , c'est-à-dire que le programme / l'application recherche un fichier de configuration et en lit les valeurs. Vous pouvez archiver un exemple de configuration avec des espaces réservés mais avoir la configuration réelle locale dans votre machine.

Dans votre cas, vous pouvez créer un key.conffichier texte avec la clé réelle, laisser le programme utiliser ce fichier et le laisser ignoré par le contrôle de version. Pour être utile, vous pouvez archiver un key.conf.examplefichier texte avec une fausse clé et l'archiver. Assurez-vous que votre programme / application envoie un message d'erreur utile pour que l'utilisateur ajoute la clé réelle dans le fichier correct.

Certains langages de programmation ont des API qui vous fournissent cela automatiquement, comme:

Si votre application est une application de base de données, envisagez de placer la clé ou d'autres variables de configuration dans la base de données. Il est identique au fichier texte de configuration ci-dessus mais vous placez toutes les variables de configuration telles que la clé dans une table de base de données à la place.

Via la vue des préférences ou une application Back Office

Si le programme est une fenêtre ou une application Web avec des vues, vous pouvez également laisser l'application créer le fichier de configuration, via une sorte de vue des préférences. De cette façon, vous n'avez pas besoin d'archiver un exemple de fichier de configuration comme suggéré ci-dessus.

MediaWiki a résolu ce problème de manière similaire en générant automatiquement le LocalSettings.phpfichier lors d'un processus d'installation initial.

Certes, ce n'est pas une option pour les programmes qui s'exécutent uniquement en tant que processus d'arrière-plan, services ou démons. Cependant, c'est pourquoi vous créez des projets GUI séparés pour ceux-ci afin de créer un point d'entrée pour les paramètres d'administration et de préférences, dans les applications Web généralement appelées application Back Office .

Spoike
la source
Une chose à noter ici: avoir l'application elle-même modifier ses propres paramètres de configuration signifie que le fichier de paramètres doit être accessible en écriture par l'utilisateur de l'application, ce qui à son tour augmente la surface d'attaque, vous devriez donc réfléchir sérieusement si vous avez vraiment besoin d'une telle interface utilisateur.
tdammers
2

Le moyen le plus simple consiste à ne pas publier de données confidentielles. Quelques options:

  • Utilisez un espace réservé comme dans la question.
  • Utilisez un fichier d'en-tête spécialement pour la clé, ne le soumettez pas au contrôle de code source et ne le distribuez qu'en privé à des tiers de confiance.

J'ai utilisé la deuxième option pour le développement open source, car cela signifie que vous n'avez pas à vous soucier de remplir les détails juste avant la construction, ou d'avoir une modification à retenir pour ne pas valider.

Hugo
la source
2

Si quelqu'un a le code source (ou un code d'octet qui peut être rétroconçu), il pourra obtenir la clé secrète en exécutant le code dans un débogueur et en plaçant un point d'arrêt à l'endroit où vous envoyez la clé.

Vous pouvez le rendre un peu plus difficile en fournissant une bibliothèque C précompilée qui parle de drop box, avec la clé encodée, mais il y a encore beaucoup de façons dont les clés vont fuir (je pense aux chaînes par exemple).

Le seul moyen sûr que je puisse penser de le faire, est de fournir un service Web qui effectue la publication dans la zone de dépôt. De cette façon, la clé secrète reste sur votre serveur sous votre contrôle. Les coûts d'hébergement et de bande passante signifient que cette solution n'est pas idéale pour une application gratuite, mais le bonus supplémentaire est que votre serveur peut authentifier correctement les clients avant de relayer leurs fichiers envoyés vers dropbox.

Michael Shaw
la source