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?
quelle
Antworten:
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.conf
Textdatei 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, einekey.conf.example
Textdatei 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:
App.Config
Dateien, auf die über die zugegriffen werden kann ConfigurationManager .NET-API zugegriffen werden kannpackage.json
oder das Einfügen von Konfigurationswerten in JSON-Dateien, und mit der Dateimodul-API können die Dateien einfach analysiert und verwendet werden, da sie im Grunde genommen JavaScript-Objektliterale sind .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.php
Datei 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 .
quelle
Am einfachsten ist es, keine vertraulichen Daten zu veröffentlichen. Einige Optionen:
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.
quelle
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.
quelle