Strategie, um geheime Informationen wie API-Schlüssel aus der Quellcodeverwaltung herauszuhalten?


217

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: /


6
Sie können sicherstellen, dass sich die Konfigurationsdatei, in der sich Ihr API-Schlüssel befindet, nicht im Quellcodeverzeichnis befindet, sodass ein erstmaliges Einchecken nicht möglich ist.
David Sergey

22
BitBucket.org hat unbegrenzte private Repositories. Kostenlos. Und GitHub-Repository-Importeur (hält Geschichte)
Rob van der Veer

4
@Dainius Ich vertraue meinen Entwicklern nicht, weil ich sie kenne. Intim. Tatsächlich bin ich zumindest mit mir selbst vertraut ... nein, ich werde das eine lügen lassen. Aber ich weiß, wie einfach es ist, Fehler zu machen, und wie schwer es sein wird, die Geschichte dieser Fehler zu bereinigen.
Wird

15
@Dainius: Ja. Ich sehe mir jeden einzelnen Charakter meiner Teamcodes an. Ernsthaft. Ich habe keine Wahl. Ich kann nicht mit verbundenen Augen codieren. Zumindest nicht zuverlässig. Aber das tue ich, weil ich mein Team bin. Ich bin das Ich im TEAM. Es gibt einen Entwickler und ich bin es. Ich bin er Ja. Ich bin der Typ, der das vermasselt, wenn er es nicht richtig macht. Mich.
Wird

3
Warum versuchen Sie überhaupt, den Schlüssel in den Code zu kompilieren? Normalerweise wird so etwas in eine Konfigurationsdatei geschrieben.
Donal Fellows

Antworten:


128

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 .


8
@RobertHarvey, indem Sie die Versionskontrolle einfach nicht aktivieren und bei Bedarf eine Ignorierregel hinzufügen. Jeder, der die Software verwendet, muss eine eigene Konfigurationsdatei mit einem eigenen API-Schlüssel erstellen.
Philipp

10
Wenn Sie also eine Distribution Ihrer Software erstellen, wie sind Sie sicher, dass diese mit einer Konfigurationsdatei geliefert wird? Sofern Sie keine Datei mit angemessenen Standardeinstellungen haben, ist es normalerweise nicht sinnvoll, von Ihrem Benutzer zu erwarten, dass er einen Prozess zum Erstellen einer Konfigurationsdatei durchläuft.
Thomas Owens

4
Nun, Werkseinstellungen sind ein Teil, "Installer" oder "First Run Wizards" ein anderer
johannes

6
Wenn viele Benutzer eine eigene Installation haben, sollten sie dann nicht ihren eigenen API-Schlüssel erstellen und verwenden? Mehrere Sites / Installationen mit demselben Schlüssel sind wahrscheinlich eine schlechte Idee. Wenn es sich nur um eine Installation handelt, ist die Verwendung einer Konfigurationsdatei kein großer Aufwand.
Mike Weller

10
@Will, wenn Sie dies aufgrund der Unpraktikabilität der Implementierungsdetails nicht tun können, dann würde ich sagen, dass Sie einfach nicht über die richtigen Tools für die Bereitstellung verfügen. Die Bereitstellung mit einer nicht festgeschriebenen geheimen Konfigurationsdatei sollte völlig problemlos sein. Ich kann Ihnen keine spezifischen Ratschläge geben, da ich im Ruby-Ökosystem und nicht in C # lebe. Aber Ruby-Leute neigen dazu, Capistrano für automatisierte Bereitstellungen zu verwenden. Ich bin sicher, dass C # auch ein Tool für die automatisierte Bereitstellung hat, was den Prozess vereinfachen sollte.
Ben Lee

29

Sie können alle privaten / geschützten Schlüssel als Systemumgebungsvariablen angeben. Ihre Konfigurationsdatei sieht folgendermaßen aus:

private.key=#{systemEnvironment['PRIVATE_KEY']}

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:

private.key=A_DEVELOPMENT_LONG_KEY

Dies wäre eine vernünftige Lösung, wenn ich es mit meiner Hosting-Option zum Laufen bringen könnte. Dies sind keine Umgebungsvariablen, aber möglicherweise einige Schlüssel / Wert-Konfigurationspaare, die nach der Veröffentlichung nicht gelöscht werden ...
Will

Wie wäre es, wenn Sie diese Umgebungsvariablen vor dem Versand in die Live-Umgebung in Ihren Build-Server übernehmen? Auf diese Weise sind Sie für Produktionsressourcen / Konfigurationsdateien bereit.
Ioannis Tzikas

Der Build-Server ist die Entwicklungsmaschine, weshalb ich besorgt bin, dass diese Informationen möglicherweise versehentlich in die Quellcodeverwaltung eingecheckt werden.
Wird

Das Problem dabei kann sein, dass die Umgebung von jedem auf dem Server gelesen werden kann.
JasonG

Die Envvars eines Benutzers sind nur für den Benutzer oder den Root lesbar. (Ancient Linux und AIX haben dies jedoch nicht getan)
Neil McGuigan,

27

Reine Git Weise

  • .gitignore enthaltene Datei mit privaten Daten
  • Verwenden Sie eine lokale Niederlassung, in dem Sie ersetzen TEMPLATEmitDATA
  • Verwenden Sie Smudge / Clean-Filter, in denen das Skript des (lokalen) Filters bidirektionales Ersetzen TEMPLATE<-> ausführtDATA

Merkurischer Weg

  • MQ-Patch (es) auf dem Dummy - Code, der ersetzen TEMPLATEmit DATA(Changeset öffentlich sind, Patch ist privat)
  • Schlüsselworterweiterung mit speziell gestalteten Schlüsselwörtern (nur in Ihrem Arbeitsverzeichnis erweitert )

SCM-agnostischer Weg

  • Ersetzen von Schlüsselwörtern als Teil des Erstellungs- / Bereitstellungsprozesses

Hmmm ... Der git-Rat ist gut, und Ihr agnostischer Rat gibt mir eine gute Idee ... Ich kann Build-Ereignisse verwenden, um die Datei in den Veröffentlichungsprozess einzuführen und anschließend zu entfernen, um sicherzustellen, dass dies nicht der Fall ist versehentlich zur Quellcodeverwaltung hinzugefügt werden ..
Wird

7
Nein, nein und noch einmal - nein! Das Ignorieren von Dateien ist gut geeignet, um bestimmte Anpassungen für den Erstellungsprozess oder ähnliches vorzunehmen. Es sollte jedoch niemals zum Speichern sicherer Daten verwendet werden. Speichern Sie keine sicheren Daten in repo, auch wenn Sie diese ignorieren.
Shabunc

11
@shabunc - RTFM! Ignorierte Datei nicht im Repo gespeichert
Lazy Badger

9
@ LazyBadger - Ich weiß ziemlich genau, dass es ignoriert wird. Ich weiß auch, dass es IMMER eine Chance gibt, dass jemand, der im Repo ist, es trotzdem fälschlicherweise irgendwie zum Repo hinzufügt. Ein externer Konfigurationspfad ist viel besser.
Shabunc

4
@shabunc - ein guter Punkt, um die Konfiguration aus dem SCM-Pfad herauszuhalten. Aus diesem Grund können Sie beispielsweise mit Postgres die Kennwortüberprüfung umgehen, indem Sie das Kennwort in eine Datei einfügen. Die Kennwortdatei muss jedoch in ~ / .pgpass abgelegt werden. Dies ist vermutlich kein Ort, an dem das Einchecken in die Quellcodeverwaltung sehr bequem ist. Sie wissen, für die Automatisierung müssen sie Ihnen eine Waffe geben, aber sie arbeiten hart, um Sie davon abzuhalten, sich damit in den Fuß zu schießen.
Steve Midgley

14

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.


3
Dies ist eine großartige Lösung - ich bin überrascht, dass Sie nicht mehr Stimmen haben. Ich arbeite mit einem Unternehmen zusammen, das sich mit Studiendaten befasst, die in den USA gesetzlich geregelt sind. Daher müssen sie besonders vorsichtig mit Ausweisen und Geheimnissen umgehen. Sie sind auch ein großes Unternehmen, daher müssen sie SCM als Berechtigungsnachweis verwenden, damit die IT-Abteilung sie finden und verwalten kann, nachdem Engr sie erstellt hat. Ihre Lösung ist genau das, was sie tun. Sie haben Entschlüsselungsschlüsseldateien, die Entschlüsselungsschlüssel für dev / staging / prod / etc enthalten (jeweils eine Datei). Dann werden alle Geheimnisse verschlüsselt und in Dateien eingecheckt. Die entschlüsselten Dateien werden verwendet, um sie in jeder Umgebung abzurufen.
Steve Midgley

7
Nun, in gewisser Weise wird durch die Verschlüsselung des Geheimnisses (in diesem Fall des API-Schlüssels) das Problem von der Nichtübergabe der geheimen Daten auf die Nichtübergabe der Passphrase (die nun zu den geheimen Daten wird ) verlagert . Aber natürlich ist es eine gute Option, beim Systemstart danach zu fragen.
Siegi

Ich mag diese Lösung. Die Art der verschlüsselten Datei, die Sie festschreiben, kann eine KeePass-Datei sein. Es würde einen Eintrag für jede Umgebung geben, in dem notesder 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 das notesFeld eines Eintrags erstellen kann . Ich denke darüber nach, eine Funktion hinzuzufügen, damit ich require('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/switchenv
Christiaan Westerbeek

14

Dies ist sehr Android / Gradle-spezifisch, aber Sie können die Schlüssel in Ihrer globalen gradle.propertiesDatei in definieren user 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

MY_PRIVATE_API_KEY=12356abcefg

build.gradle

buildTypes {
        debug{
            buildConfigField("String", "GOOGLE_VERIFICATION_API_KEY", "\"" + MY_PRIVATE_API_KEY +"\"")
            minifyEnabled false
            applicationIdSuffix ".debug"
            }
        }

In Code, auf den Sie so verweisen würden

String myAPI = BuildConfig.GOOGLE_VERIFICATION_API_KEY;

BuildConfig übersetzt in die entsprechende Quelldatei, sodass durch einfaches Reverse Engineering auf Ihrer apk alle Schlüssel und Geheimnisse enthüllt werden, die Sie in BuildConfig
Dmitri Livotov am

1
In der Tat ein gültiger Punkt. Aber die Frage war, wie man Api-Schlüssel aus dem Quellcode heraushält, nicht aus der Binärdatei.
Scottyab

11

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.cfgDatei und fügt seinen eigenen Schlüssel hinzu.

Sie behalten Ihre config.cfgfür die Entwicklung oder Produktion verwendete Datei nicht im Repository.


4
Diese Frage fragt, wie man das macht, nein, das tut es absolut NICHT. Tatsache ist, dass diese Schlüssel von Code verwendet werden müssen und daher von Code abgerufen werden können. Dies bedeutet normalerweise, dass sie über Code- oder Konfigurationsdateien verfügbar sind. Wenn sie sich nicht in der Quelle befinden, sind sie zumindest in der Nähe und könnten versehentlich in landen Quelle. Die gehostete Web-App ist leider unsinnig. Sie mussten keinen API-Schlüssel beantragen, um sich über Ihr (hypothetisches) Facebook-Konto bei StackOverflow anzumelden. Platz Schlüssel hier ist eine massive starke Vereinfachung , die dev-> pub Umgebungen wird nicht funktionieren , in wie in der Frage beschrieben wird
Will

Ich habe die Frage richtig beantwortet, wie viele andere auch. Die Tatsache, dass Sie einen dieser Schlüssel nicht akzeptiert haben, bedeutet, dass Sie nicht verstehen, wie Sie mit diesen Schlüsseln arbeiten.
Reactgular

7
Wie schützen wir dann den Key-Publishing-Webdienst? Verwenden Sie einen anderen Schlüssel?
Jiangge Zhang

Das Gleiche gilt für @JianggeZhang - dies ist ein gefährlicher Rat
David K. Hess

5

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.


3
Sicherheit durch Unbekanntheit ist für viele kein empfohlener Ansatz. Möchten Sie Ihre Antwort näher erläutern, um sie klarer zu formulieren?

2
Dies ist keine Unklarheit. Umgebungsvariablen stehen nur dem Benutzer zur Verfügung, den Sie hinzugefügt haben, sodass alle Ihre Anmeldeinformationen den gleichen Schutz für den Benutzerkontext haben, den Ihre App ausführt. Ich habe die Antwort aktualisiert, um das Konzept der Umgebungsvariablen aufzunehmen. Ist das klarer?
Filipe Giusti

4

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:

  1. Alle Konfigurationsdateien befinden sich in einem speziellen Ordner (mit Beispielkonfigurationsdateien - optional)
  2. Alle Konfigurationsdateien sind in .gitignore enthalten, damit sie nicht veröffentlicht werden
  3. Richten Sie einen gitolite-Server (oder Ihren bevorzugten git-Server) auf einer privaten Box ein
  4. Fügen Sie ein Repo mit allen Konfigurationsdateien auf dem privaten Server hinzu
  5. Füge ein Skript hinzu, um Konfigurationsdateien in den speziellen Ordner im Haupt-Repository zu kopieren (optional)

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!


2

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.


1

3 Strategien, noch nicht erwähnt (?)

Beim Einchecken oder in einem VCS-Pre-Check-In-Hook

  • suche nach strings mit hoher entropie, beispiel- detect- secret
  • Regex-Suche nach bekannten API-Schlüsselmustern. Ein Beispiel sind die AKIA * -Schlüssel von AWS. Git-Secrets ist ein Tool, das darauf basiert. Auch Variablennamen wie 'Passwort' mit ständiger Zuordnung.
  • Suche nach bekannten Geheimnissen - Du kennst deine Geheimnisse und suchst nach ihnen. Oder benutze ein Tool, ich habe diesen Proof of Concept geschrieben .

Bereits erwähnte Strategien

  • in Datei außerhalb des Quellbaums speichern
  • Habe es im Source Tree, aber sage VCS, dass es ignoriert werden soll
  • Umgebungsvariablen sind eine Variation beim Speichern von Daten außerhalb des Quellbaums
  • Geben Sie den Entwicklern nur nicht die wertvollen Geheimnisse

0

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:

  • Nimmt keine Entwicklungsentität == Produktionsentität an
  • Es wird nicht davon ausgegangen, dass allen Mitarbeitern / Codeprüfern vertraut wird
  • Verhindern Sie leichte Fehler, indem Sie die Versionskontrolle deaktivieren
  • Einfach zu automatisierende Installationen mit benutzerdefinierter Konfiguration für QA / Builds

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. ^ _ ^


-2

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.


1
Hashes sind im Allgemeinen Einweg-Scrambles. Es gibt symmetrische Verschlüsselungsalgorithmen, die Ihren Vorstellungen entsprechen.

3
Alter, Sie können einen Hash nicht (leicht) entschlüsseln. Das ist der springende Punkt bei Hashes. Dies ist für ME bestimmt, der die API eines anderen Benutzers verwendet, der ME einen geheimen Schlüssel zuweist. Mein Hashing stellt sicher (es sei denn, ich wähle ein schlechtes Algo und knacke es jedes Mal), dass ich ihre API nicht verwenden kann.
Wird
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.