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?
la source
Réponses:
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.conf
fichier 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 unkey.conf.example
fichier 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:
App.Config
fichiers accessibles via l' API ConfigurationManager .NETpackage.json
ou mettent des valeurs de configuration dans les fichiers json, et avec l' API des modules de fichiers, les fichiers sont faciles à analyser et à utiliser car ils sont essentiellement des littéraux d'objet JavaScript .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.php
fichier 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 .
la source
Le moyen le plus simple consiste à ne pas publier de données confidentielles. Quelques options:
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.
la source
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.
la source