Wie kann ich vertrauliche Daten in meinem Open Source-Projekt verbergen?

13

Ich habe ein Open-Source-Projekt, das Dateien zwischen mehreren Datei-Hosts auf DropBox hochlädt. Im Moment bin ich für DropBox Screen Scraping. Um ihre API zu verwenden, muss ich einen von ihnen bereitgestellten SECRET KEY für die OAuth-Authentifizierung fest codieren. Aber ich fürchte, der Schlüssel wird nicht geheim sein, wenn er für jedermann sichtbar ist.

Es ist 'möglich', dass ein Angreifer mit meinem Schlüssel einen Virus in ein Benutzerkonto hochlädt (das bereits Zugriff auf meine App gewährt hat), der sich auf seinen PC (sofern die Desktopsynchronisierung aktiviert war) und auf den PC anderer Benutzer (sofern aktiviert) ausbreitet sie hatten freigegebene Ordner) und so weiter. :Ö

Ich habe diese unbeantwortete Frage gefunden , die das gleiche Problem hat wie meine.

Ich möchte aber allgemein wissen, wie man vertrauliche Daten in einem Open-Source-Projekt versteckt.

Ich habe eine Idee.

  • Haben Sie einen Platzhalter im Quellcode wie "<SECRET KEY HERE>" und füllen Sie ihn nur aus, wenn Sie eine Binärdatei für die Veröffentlichung erstellen? (igitt!)

Irgendeine anständige Idee?

Vigneshwaran
quelle
1
Das ist wirklich der einzig sichere Weg. Sie könnten auch die pgp-Verschlüsselung verwenden, um Ihren geheimen Schlüssel zu verschlüsseln, dann könnten nur Sie ihn entschlüsseln, aber warum sollten Sie ihn überhaupt veröffentlichen?
Prescott
Vielleicht möchten Sie diese Frage überprüfen: programmers.stackexchange.com/questions/180957/… - es geht nicht um DropBox-API-Schlüssel, aber die allgemeine Meldung ist dieselbe.
tdammers
git-crypt wurde für dich gemacht :) github.com/AGWA/git-crypt
nha

Antworten:

14

Die Grundidee ist, dass Sie KEINE vertraulichen Werte im Code oder in der kompilierten Binärdatei einchecken . Vor allem, wenn das Projekt Open Source ist, sollten Sie das wirklich nicht tun. Es gibt verschiedene Konfigurationsstrategien, die Sie dazu verwenden können:

Platzhalter im Code (fest codierte Werte)

Platzhalter im Code - wie vorgeschlagen - sind am sinnvollsten und einfachsten in dynamischen Programmiersprachen, da der Code leicht zu ändern ist (ohne kompilieren zu müssen). Ich habe viele Open-Source-Projekte gesehen, die dies tun, wie MediaWiki LocalSettings.php.

Der Nachteil dieser Strategie ist, dass der Schlüssel fest codiert ist. Wenn das Programm also als Binärdatei verteilt wird, ist es nicht besonders wartbar, wenn der Schlüssel fest codiert ist.

Konfigurationstextdateien

Sie können dies auch tun, indem Sie Konfigurationstextdateien implementieren , dh das Programm / die Anwendung sucht nach einer Konfigurationsdatei und liest Werte aus dieser. Sie können eine Beispielkonfiguration mit Platzhaltern einchecken, die aktuelle Konfiguration befindet sich jedoch lokal auf Ihrem Computer.

In Ihrem Fall können Sie eine key.confTextdatei mit dem eigentlichen Schlüssel erstellen , das Programm diese Datei verwenden lassen und sie von der Versionskontrolle ignorieren lassen. Sie können, um hilfreich zu sein, eine key.conf.exampleTextdatei mit einem falschen Schlüssel einchecken und das Einchecken durchführen. Stellen Sie sicher, dass Ihr Programm / Ihre Anwendung dem Benutzer eine hilfreiche Fehlermeldung anzeigt, um den tatsächlichen Schlüssel in die richtige Datei einzufügen.

Einige Programmiersprachen verfügen über APIs, die dies automatisch für Sie bereitstellen, beispielsweise:

Wenn Ihre Anwendung eine Datenbank-App ist, sollten Sie den Schlüssel oder andere Konfigurationsvariablen in die Datenbank einfügen. Es ist dasselbe wie in der obigen Konfigurationstextdatei, aber Sie speichern stattdessen alle Konfigurationsvariablen wie den Schlüssel in einer Datenbanktabelle.

Über die Ansicht "Einstellungen" oder eine Back Office-App

Wenn es sich bei dem Programm um ein Fenster oder eine Webanwendung mit Ansichten handelt, können Sie die Konfigurationsdatei auch über eine Art Einstellungsansicht erstellen lassen. Auf diese Weise müssen Sie keine Beispielkonfigurationsdatei wie oben vorgeschlagen einchecken.

MediaWiki löste dies auf ähnliche Weise, indem es die LocalSettings.phpDatei bei einer Erstinstallation automatisch generierte .

Zugegebenermaßen ist dies keine Option für Programme, die ausschließlich als Hintergrundprozesse, Dienste oder Daemons ausgeführt werden. Aus diesem Grund erstellen Sie separate GUI-Projekte für diese, um einen Einstiegspunkt für Verwaltungs- und Voreinstellungen in Web-Apps zu erstellen, die normalerweise als Back-Office-Anwendung bezeichnet werden .

Spoike
quelle
Hier ist Folgendes zu beachten: Wenn die Anwendung selbst ihre eigenen Konfigurationseinstellungen ändert, muss die Einstellungsdatei vom Benutzer der Anwendung beschreibbar sein, was wiederum die Angriffsfläche erhöht. Sie sollten sich also überlegen, ob Sie wirklich eine solche Benutzeroberfläche benötigen.
tdammers
2

Am einfachsten ist es, keine vertraulichen Daten zu veröffentlichen. Einige Optionen:

  • Verwenden Sie einen Platzhalter wie in der Frage.
  • Verwenden Sie eine Header-Datei speziell für den Schlüssel, übergeben Sie sie nicht an die Quellcodeverwaltung und verteilen Sie sie nur privat an vertrauenswürdige Parteien.

Ich habe die zweite Option für die Open-Source-Entwicklung verwendet, da Sie sich nicht darum kümmern müssen, die Details direkt vor dem Erstellen einzugeben oder eine Änderung vorzunehmen, um nicht festzuschreiben.

Hugo
quelle
2

Wenn jemand über den Quellcode (oder den Bytecode, der rückentwickelt werden kann) verfügt, kann er den geheimen Schlüssel erhalten, indem er den Code in einem Debugger ausführt und an der Stelle, an der Sie den Schlüssel senden, einen Haltepunkt einfügt.

Sie können es etwas schwieriger machen, indem Sie eine vorkompilierte C-Bibliothek bereitstellen, die mit Dropbox kommuniziert, in der der Schlüssel verschlüsselt ist, aber es gibt immer noch viele Möglichkeiten, wie Schlüssel herauskommen (ich denke zum Beispiel an Strings).

Die einzige sichere Möglichkeit, die ich mir vorstellen kann, ist die Bereitstellung eines Webdienstes, der das Senden an die Dropbox übernimmt. Auf diese Weise bleibt der geheime Schlüssel auf Ihrem Server unter Ihrer Kontrolle. Die Hosting- und Bandbreitenkosten bedeuten, dass diese Lösung für eine kostenlose Anwendung weniger als ideal ist. Der zusätzliche Vorteil besteht jedoch darin, dass Ihr Server die Clients ordnungsgemäß authentifizieren kann, bevor die an Dropbox gesendeten Dateien weitergeleitet werden.

Michael Shaw
quelle