Ich arbeite an einer Website, auf der sich Benutzer mit OAuth-Anmeldeinformationen von Twitter, Google usw. anmelden können. Dazu muss ich mich bei diesen verschiedenen Anbietern registrieren und einen supergeheimen API-Schlüssel erwerben, den ich habe mit Pfand gegen verschiedene Körperteile zu schützen. Wenn mein Schlüssel gerissen wird, wird das Teil gerissen.
Der API-Schlüssel muss mit meiner Quelle übertragen werden, da er zur Laufzeit zur Ausführung von Authentifizierungsanforderungen verwendet wird. In meinem Fall muss der Schlüssel in der Anwendung in einer Konfigurationsdatei oder im Code selbst vorhanden sein. Das ist kein Problem, wenn ich von einer einzelnen Maschine aus baue und veröffentliche. Wenn wir jedoch die Quellcodeverwaltung in die Mischung einbauen, werden die Dinge komplizierter.
Da ich ein billiger Bastard bin, würde ich kostenlose Quellcodeverwaltungsdienste wie TFS in der Cloud oder GitHub bevorzugen. Dies lässt mich ein kleines Rätsel aufkommen:
Wie kann ich meinen Körper intakt halten, wenn sich meine API-Schlüssel in meinem Code befinden und mein Code in einem öffentlichen Repository verfügbar ist?
Ich kann mir eine Reihe von Möglichkeiten vorstellen, damit umzugehen, aber keine davon ist so befriedigend.
- Ich könnte alle privaten Informationen aus dem Code entfernen und sie nach der Bereitstellung wieder bearbeiten. Dies zu implementieren wäre ein schwerwiegender Schmerz (ich werde nicht auf die vielen Möglichkeiten eingehen) und ist keine Option.
- Ich könnte es verschlüsseln. Aber da ich es entschlüsseln muss, kann jeder mit der Quelle herausfinden, wie es geht. Zwecklos.
- Ich könnte für die private Quellcodeverwaltung bezahlen. LOL J / K Geld ausgeben? Bitte.
- Ich könnte Sprachfunktionen verwenden, um vertrauliche Informationen vom Rest meiner Quelle zu trennen und sie daher der Quellcodeverwaltung zu entziehen. Das ist, was ich jetzt tue, aber es könnte leicht durch versehentliches Einchecken der geheimen Datei vermasselt werden.
Ich bin wirklich auf der Suche nach einem garantierten Weg, um sicherzustellen, dass ich meine Daten nicht mit der Welt teile (außer mit Snapchat), der durch Entwicklung, Debugging und Bereitstellung reibungslos funktioniert und außerdem kinderleicht ist. Das ist völlig unrealistisch. Was kann ich also realistisch tun?
Technische Details: VS2012, C # 4.5, Quellcodeverwaltung wird entweder TF-Dienst oder GitHub sein. Derzeit wird eine Teilklasse verwendet, um die vertraulichen Schlüssel in einer separaten CS-Datei aufzuteilen, die der Quellcodeverwaltung nicht hinzugefügt wird. Ich denke, GitHub könnte den Vorteil haben, dass .gitignore verwendet werden könnte, um sicherzustellen, dass eine Teilklassendatei nicht eingecheckt wird, aber ich habe das schon früher vermasselt. Ich hoffe auf ein "oh, allgemeines Problem, so machst du es", aber ich muss mich vielleicht mit "das saugt nicht so viel, wie es haben könnte" zufrieden geben: /
Antworten:
Tragen Sie Ihre geheimen Informationen nicht in Ihren Code ein. Legen Sie es in eine Konfigurationsdatei, die beim Start von Ihrem Code gelesen wird. Konfigurationsdateien sollten nicht der Versionskontrolle unterzogen werden, es sei denn, es handelt sich um die "werkseitigen Standardeinstellungen", und sie sollten dann keine privaten Informationen enthalten.
Informationen dazu finden Sie in der Frage Versionskontrolle und persönliche Konfigurationsdatei .
quelle
Sie können alle privaten / geschützten Schlüssel als Systemumgebungsvariablen angeben. Ihre Konfigurationsdatei sieht folgendermaßen aus:
So gehen wir mit diesen Fällen um und nichts geht in den Code. Es funktioniert sehr gut in Kombination mit verschiedenen Eigenschaftendateien und -profilen. Wir verwenden unterschiedliche Eigenschaftendateien für unterschiedliche Umgebungen. In unserer lokalen Entwicklungsumgebung haben wir die Entwicklungsschlüssel in die Eigenschaftendateien eingefügt, um die lokale Einrichtung zu vereinfachen:
quelle
Reine Git Weise
.gitignore
enthaltene Datei mit privaten DatenTEMPLATE
mitDATA
TEMPLATE
<-> ausführtDATA
Merkurischer Weg
TEMPLATE
mitDATA
(Changeset öffentlich sind, Patch ist privat)SCM-agnostischer Weg
quelle
Ich lege Geheimnisse in verschlüsselte Dateien, die ich dann festschreibe. Die Passphrase wird beim Start des Systems bereitgestellt oder in einer kleinen Datei gespeichert, die ich nicht festschreibe. Es ist schön, dass Emacs diese verschlüsselten Dateien munter verwaltet. Zum Beispiel enthält die emacs-Init-Datei: (load "secrets.el.gpg"), was einfach funktioniert - und mich in den seltenen Fällen zur Eingabe des Passworts auffordert, wenn ich den Editor starte. Ich mache mir keine Sorgen, dass jemand die Verschlüsselung bricht.
quelle
notes
der Inhalt der ENV-Datei in dem Feld gespeichert wird. Vor ein paar Monaten habe ich ein Tool geschrieben, das eine keepass-Datei lesen und eine .env-Datei über dasnotes
Feld eines Eintrags erstellen kann . Ich denke darüber nach, eine Funktion hinzuzufügen, damit ichrequire('switchenv').env()
oben in Node.js Programm process.env-Variablen erstellen kann, die auf dem Eintrag basieren, der mit NODE_ENV übereinstimmt, oder so ähnlich. -> github.com/christiaanwesterbeek/switchenvDies ist sehr Android / Gradle-spezifisch, aber Sie können die Schlüssel in Ihrer globalen
gradle.properties
Datei in definierenuser home/.gradle/
. Dies ist auch nützlich, da Sie je nach BuildType oder Version, dh API für dev und unterschiedliche für release, unterschiedliche Eigenschaften verwenden können.gradle.properties
build.gradle
In Code, auf den Sie so verweisen würden
quelle
Sie sollten diesen Schlüssel nicht mit Ihrer Anwendung verteilen oder im Quellcode-Repository speichern. Diese Frage fragt, wie man das macht, und das ist nicht das, was normalerweise gemacht wird.
Mobile Webanwendung
Für Android / iPhone sollte das Gerät den SCHLÜSSEL von Ihrem eigenen Webdienst anfordern, wenn die App zum ersten Mal ausgeführt wird. Der Schlüssel wird dann an einem sicheren Ort aufbewahrt. Sollte der Schlüssel vom Verlag geändert oder widerrufen werden. Ihr Webdienst kann einen neuen Schlüssel veröffentlichen.
Gehostete Webanwendung
Kunden, die eine Lizenz für Ihre Software verwenden, müssen den Schlüssel bei der Erstkonfiguration der Software manuell eingeben. Sie können jedem den gleichen oder einen anderen Schlüssel geben oder ihm einen eigenen geben.
Veröffentlichter Quellcode
Sie speichern Ihren Quellcode in einem öffentlichen Repository, nicht jedoch den KEY. In der Konfiguration der Datei fügen Sie die Zeilen ein * Schlüssel hier platzieren * . Wenn ein Entwickler Ihren Quellcode verwendet, erstellt er eine Kopie der
sample.cfg
Datei und fügt seinen eigenen Schlüssel hinzu.Sie behalten Ihre
config.cfg
für die Entwicklung oder Produktion verwendete Datei nicht im Repository.quelle
Verwenden Sie Umgebungsvariablen für geheime Dinge, die sich für jeden Server ändern.
http://en.wikipedia.org/wiki/Environment_variable
Wie man sie benutzt, ist sprachabhängig.
quelle
Ich denke, das ist ein Problem, mit dem jeder irgendwann Probleme hatte.
Hier ist ein Workflow, den ich verwendet habe und der möglicherweise für Sie funktioniert. Es verwendet .gitignore mit einem Twist:
Jetzt können Sie das Konfigurations-Repo auf jedes Entwicklungs- und Bereitstellungssystem klonen. Führen Sie einfach das Skript aus, um die Dateien in den richtigen Ordner zu kopieren, und schon sind Sie fertig.
Du bekommst immer noch alle GitHub-Bonbons, teilst deinen Code mit der Welt und die sensiblen Daten befinden sich nie im Hauptrepo, sodass sie nicht an die Öffentlichkeit gehen. Sie sind immer noch nur eine Anziehungskraft und eine Kopie von jedem Bereitstellungssystem entfernt.
Ich benutze eine 15 $ / Jahr Box für den privaten Git Server, aber du kannst auch eine zu Hause einrichten, je nach den Anforderungen von cheapskate ;-)
PS: Sie können auch ein Git-Modul verwenden ( http://git-scm.com/docs/git-submodule ), aber ich vergesse immer die Befehle, also schnelle und schmutzige Regeln!
quelle
Verwenden Sie die Verschlüsselung, geben Sie jedoch beim Start einen Hauptschlüssel als Kennwort an der Konsole in eine Datei ein, die nur der Benutzer des Prozesses lesen kann, oder aus einem vom System bereitgestellten Schlüsselspeicher wie dem Mac OS-Schlüsselbund oder dem Windows-Schlüsselspeicher.
Für eine kontinuierliche Lieferung möchten Sie, dass verschiedene Schlüssel irgendwo aufgezeichnet werden. Die Konfiguration sollte vom Code abgegrenzt werden, aber es ist sehr sinnvoll, sie unter Versionskontrolle zu halten.
quelle
3 Strategien, noch nicht erwähnt (?)
Beim Einchecken oder in einem VCS-Pre-Check-In-Hook
Bereits erwähnte Strategien
quelle
Halten Sie private Informationen von Ihrer Quellcodeverwaltung fern. Erstellen Sie einen nicht geladenen Standard für die Verteilung, und lassen Sie Ihr VCS den echten ignorieren. Ihr Installationsprozess (ob manuell, konfigurieren / erstellen oder Assistent) sollte das Erstellen und Auffüllen der neuen Datei behandeln. Ändern Sie optional die Berechtigungen für die Datei, um sicherzustellen, dass nur der erforderliche Benutzer (Webserver?) Sie lesen kann.
Leistungen:
Wenn Sie dies bereits tun und es versehentlich einchecken, fügen Sie es Ihrem Projekt hinzu
.gitignore
. Das macht es unmöglich, es noch einmal zu tun.Es gibt viele kostenlose Git-Hosts, die private Repositories bereitstellen. Obwohl Sie Ihre Anmeldeinformationen niemals versionieren sollten, können Sie billig sein und auch private Repos haben. ^ _ ^
quelle
Warum sollten Sie den OAuth-Schlüssel nicht irgendwo als Rohdaten speichern, sondern den String durch einen Verschlüsselungsalgorithmus führen und als gesalzenen Hash speichern? Verwenden Sie dann eine Konfigurationsdatei, um sie zur Laufzeit wiederherzustellen. Auf diese Weise wird der Schlüssel nirgendwo gespeichert, egal ob auf einer Entwicklungsbox oder auf dem Server.
Sie können sogar eine API erstellen, sodass Ihr Server auf Anfragebasis automatisch einen neuen gesalzenen und gehashten API-Schlüssel generiert. Auf diese Weise kann nicht einmal Ihr Team die OAuth-Quelle sehen.
Bearbeiten: Vielleicht probieren Sie die Stanford Javascript Crypto Library aus . Sie ermöglicht eine ziemlich sichere symmetrische Verschlüsselung / Entschlüsselung.
quelle