Das Secret System

Der Secret Generator ist ein Werkzeug das die notwendigen Schlüsselpaare erstellt, welche für eine Authentifizierung zwischen Client und Serversystemen notwendig sind.

Grundlagen

Warum ein Secret-System?

Benutzername und Passwort funktionieren gut, wenn sich Menschen bei einem System anmelden. Doch wenn sich Systeme gegenseitig authentifizieren sollen – also zum Beispiel ein Client bei einem Server –, wird es kompliziert. Es gibt keine echten „Benutzer“, die ein Passwort eingeben. Stattdessen braucht es eine sichere, automatisierbare Methode zur gegenseitigen Identifikation.

Genau hier setzt unser Secret-System an: Es ersetzt Benutzernamen und Passwörter durch technische Schlüssel (Key) und eindeutige Geheimnisse (Secrets). Diese können vom System selbst erzeugt, gespeichert und verwendet werden – ganz ohne menschliches Zutun. Dadurch vermeiden wir typische Fehlerquellen wie schwache Passwörter oder wiederverwendete Zugangsdaten.

Vorteile des Secret-Systems

  • Automatisch generiert: Unsere Secrets sind zufällig und extrem komplex – 128 Zeichen aus einem 87-Zeichen-Alphabet. Das macht sie praktisch unmöglich zu erraten oder zu knacken.

  • Keine menschlichen Schwächen: Da der Mensch keine Passwörter mehr erstellt, entfallen Risiken wie einfache oder wiederverwendete Passwörter.

  • Hashing und Salting: Der Server speichert nicht das echte Secret, sondern einen sogenannten gesalzenen Hash. Selbst bei einem Datenleck bleibt das Secret damit sicher.

  • Brute-Force ist nutzlos: Mit 87^128 möglichen Kombinationen ist ein Durchprobieren technisch ausgeschlossen. Auch vorberechnete Rainbow-Tabellen helfen nicht weiter – dafür sorgt der individuell erzeugte Salt.

Deine Verantwortung

Unser Secret-System ist trotz allem kein Wundermittel. Schütze das Secret auf der Clientseite genau so gut wie jedes andere Passwort. Zudem muss die Verbindung zwischen Client und Server verschlüsselt sein, damit das Secret auch unterwegs geheim bleibt.

Fazit

Das Secret-System bietet eine deutlich sicherere und robustere Grundlage für die Authentifizierung zwischen Systemen. Es wurde genau dafür entworfen: Verlässlich, automatisierbar und frei von menschlichen Fehlern.

Konfiguration

Ein Produkt, das das Secret System unterstützt, besteht in der Regel aus einem Server- und einem Client-Teil. Beide Teile benötigen eine individuelle Konfiguration. Die genauen Namen und die Struktur der Konfiguration sind in der jeweiligen Produkt-Dokumentation zu finden. Die Konfiguration dieser Parameter ähnelt sich jedoch stark, daher erklären wir im Folgenden die übliche Vorgehensweise.

Der Client-Teil

Die Konfiguration auf Client-Seite enthält normalerweise die folgenden Werte:

<Module name="Application">
    ...
    <Value name="apiKey">[API Key]</Value>
    <Value name="apiSecret">[API Secret]</Value>
    ...
</Module>

Diese Bezeichnungen können je nach Anwendung variieren, oder sie werden gemeinsam mit anderen Netzwerkoptionen konfiguriert. Du findest jedoch immer einen Wert, der „Key“ im Namen hat, und einen, der „Secret“ enthält.

Der Wert apiKey (oder ähnlich)

Den im Feld Key des Secret Generators angezeigten Text kopierst du in den Wert apiKey. Dieser Schlüssel muss mit einem „Key“-Eintrag auf der Serverseite übereinstimmen. Stelle also sicher, dass du auch auf der Serverseite einen entsprechenden Eintrag konfiguriert hast.

Der Wert apiSecret (oder ähnlich)

Den Text, den du im Feld Client Secret findest, fügst du in den Wert apiSecret ein. Achte darauf, diesen Wert nicht mit Server Secret zu verwechseln. Die „Secret“-Texte für Client und Server sind nämlich unterschiedlich.

Wichtig

Da der Wert in apiSecret oder wie immer er in der jeweiligen Anwendung genannt wird, im Grunde ein Passwort ist, solltest du es auch wie ein solches behandeln und entsprechend schützen. In den meisten unserer Anwendungen kannst du Passwörter „verschlüsseln“. Das verhindert, dass sie versehentlich zugänglich werden, falls jemand Lesezugriff auf die Konfigurationsdatei hat. Wie du dies machst und alle weiteren Details dazu findest du im Abschnitt Kodieren von Passwörtern.

Die Server-Seite

Auf der Server-Seite konfigurierst du eine Liste von Schlüsselpaaren. Eine solche Konfiguration könnte wie folgt aussehen:

<List name="secrets">
    <ListEntry>
        <Value name="label">api-connection</Value>
        <Value name="key">[API Key]</Value>
        <Value name="secret">[Hashed API Secret]</Value>
        <Value name="authorizedNetworks">10.210.7.0/24</Value>
        ... Weitere anwendungsspezifische Werte ...
    </ListEntry>
    <ListEntry>
        <Value name="label">client-connection</Value>
        <Value name="key">[API Key]</Value>
        <Value name="secret">[Hashed API Secret]</Value>
        <Value name="authorizedNetworks">10.18.67.0/24</Value>
        ... Weitere anwendungsspezifische Werte ...
    </ListEntry>
    ... weitere Einträge ...
</List>

Der Name der Liste ist in diesem Beispiel secrets, er kann jedoch je nach Anwendung variieren. Die Werte label, key und secret, sowie der optionale Wert authorizedNetworks sind in jeder Konfiguration gleich.

Der Wert label

Mit dem Wert label gibst du der Verbindung einen lesbareren Namen. Dieser Name wird meistens in Logdateien und Fehlermeldungen anstelle des Schlüssels in key verwendet, da er die Identifizierung einer Verbindung vereinfacht. Abgesehen davon hat er keine Auswirkungen auf die Funktionalität des Servers.

Der Wert key

Mit dem Wert key definierst du einen eindeutigen Bezeichner für ein Secret. Dabei nutzt du den Text, den du im Feld Key des Secret Generators findest. Dieser Text muss mit dem Schlüssel des Software-Clients übereinstimmen.

Der Wert secret

Das eigentliche Secret konfigurierst du mit dem Wert secret. Dabei verwendest du den Text, der im Feld Server Secret angezeigt wird. Achte darauf, diesen Wert nicht mit Client Secret zu verwechseln. Die „Secret“-Texte für den Server unterscheiden sich, da sie durch einen Hash geschützt werden.

Der Wert authorizedNetworks

Mit dem optionalen Wert authorizedNetworks kannst du die Verbindungen einschränken. Hierbei gibst du eine Liste von Netzwerken an. Die Netzwerke können als IPv4 oder IPv6 Subnetze angegeben werden und werden mit Whitespace getrennt. Einige Beispiele sind: ‚192.168.1.0/24‘, ‚10.0.0.0/16‘, ‚2001:db8::/32‘ usw.

Lässt du den Wert authorizedNetworks weg, oder ist er leer, dann werden Verbindungen von allen Adressen akzeptiert. Wir empfehlen die Verbindungen immer zusätzlich mit einem gültigen Netzwerk einzuschränken.

Jede Anwendung bietet unterschiedliche anwendungsspezifische Werte, mit denen du eine Verbindung, die das definierte Schlüsselpaar verwendet, weiter einschränken kannst oder den Zugriff auf Daten limitieren kannst. Informationen zu diesen Werten findest du in der Dokumentation des jeweiligen Produkts.

Der Secret Generator

Nachdem du das Secret Generator Werkzeugs startest erscheint das Hauptfenster. Der obere Bereich ist dabei der Eingabebereich, darunter findest du den Ausgabebereich.

../../../_images/secret-generator-main-window.jpg

Die Elemente im Secret Generator Fenster.

  • A In dem Feld Label gibst du dem Eintrag einen Namen. Dieser wird als label der Serverkonfiguration hinzugefügt.

  • B Darunter, im Feld Authorized Networks gibst du die IP-Adressen und Netzwerke ein, welche für den Eintrag zugelassen sind. Trenne dabei mehrere Einträge mit einem Leerzeichen.

    Wenn der Eintrag rot wird, ist ein Fehler in den eingegebenen Netzwerkadressen.

  • C Falls du das Schlüsselpaar für eine Authentifizierung über eine HTTPS/JSON Schnittstelle verwendest, solltest du die Option Limit key characters for HTTP authentication auswählen.

    Dabei wird ein anderer Satz von Zeichen verwendet, welcher bei dieser Art von Authentifizierung keine Probleme macht.

  • D Mit der Option Version wählst du welche Version des Schlüsselpaars generiert werden soll. Verwende hier nur Version 2, ausser du erzeugst ein Schlüsselpaar für eine sehr alte Softwareversion.

  • E Klickst du auf den Generate New Key-Pair Knopf wird ein neues Schlüsselpaar mit den aktuellen Einstellungen erzeugt. Die dazugehörigen Daten erscheinen in den Feldern unten.

  • F In diesem Bereich findest du die Werte und eine Konfigurationsschnipsel für die Client-Konfiguration. Es kann sein dass du die Namen der Werte für die Konfiguration anpassen musst, der Generator erzeugt lediglich ein Beispiel mit den am häufigsten verwendeten Werten.

  • G Darunter findest du die Werte, sowie ein Konfigurationsschnipsel für die Server-Konfiguration. Je nach Anwendung musst du möglicherweise noch weitere Werte zu dem Eintrag hinzufügen. Der Generator erzeugt hier lediglich ein Beispiel mit den Grundwerten.

  • H Mit dem Knopf Copy to Clipboard kopierst du schnell den Inhalt des Feldes auf der linken Seite in die Zwischenablage.

Das Kommandozeilen Werkzeug

Für den Fall du das Erzeugen von Schlüsselpaaren automatisieren möchtest, existiert ein Kommandozeilen Werkzeug. Dieses generiert neue Schlüsselpaare und gibt dir als Resultat XML oder JSON zurück.

Mit --help bekommst du eine Übersicht aller Optionen:

E:\>SecretGeneratorCommand.exe --help
SecretGeneratorCommand.exe [options]
Options:
--config-dir=... [list]
    Add another directory to scan for configuration files.
--config-file=... [list]
    Add another configuration file to parse.
--file=..., -o=... [string value]
    If you specify this option, the output is written to the given file instead
    of the console. An existing file is overwritten.
--format=..., -f=... [string value]
    Select the format of the secret output.
--help, -h [boolean value]
    Displays help about command line arguments.
--label=..., -l=... [string value]
    An optional descriptive label for secret entry. This label is used in the
    application for log and error messages.
--limit-for-web, -w [boolean value]
    Limit the characters in the generated secrets to a set suitable for web
    basic authentication. Use this option if you like to authenticate using a
    HTTP/JSON network interface.
--network=..., -n=... [list]
    Add an authorized network for the entry. You can specify this option
    multiple times to add multiple networks. The value has to be either an IPv4
    or IPv6 network with slash/prefix notation. Example: 10.0.0.0/24
--version=..., -v=... [integer value]
    Optional the secret version to use. Use this option if you need to create
    secrets for old software versions. By default, the latest version is used.

Optionen

--file=<file>, -o=<file>

Mit dieser Option wählst du eine Datei in welche die Ausgabe geschrieben wird. Lässt du diese Option weg, wird die Ausgabe in die Konsole geschrieben.

--format=<format>, -f=<format>

Mit dieser Option wählst du das Format der Ausgabe. Mögliche Werte sind hier:

  • xml Generiert zwei Blöcke mit XML Daten für die Konfiguration. Die beiden Blöcke werden dabei mit den Zeilen Client: und Server: getrennt.

  • json Generiert einen JSON Dokument, welches alle generierten Werte enthält.

--label=<label>, -l=<label>

Mit dieser Option kannst du den Namen des Eintrags setzen.

--limit-for-web, -w

Mit dieser Option wählst du das alternative Set von Zeichen für die Web kompatible Authentifizierung.

--network=<network>, -n=<network>

Diese Option kannst du mehrmals angeben. Dabei gibst du jedes mal eine erlaubte IP-Adresse oder Netzwerk an.

--version=<version>, -v=<version>

Mit dieser Option wählst du das Format des generierten Schlüsselpaars. Lässt du sie weg, wird automatisch die neuste Version verwendet.

Beispiele

Das folgende Beispiel ruft das Werkzeug ohne Optionen auf. Dabei wird ein Schlüsselpaar erzeugt und dieses in einem JSON Block ausgegeben:

E:\>SecretGeneratorCommand.exe
{"clientSecret": "9UOL}ItEs)xIz,;0jpN=8vt#[^u,djkT_JO;GO5kYmLN[JBT6K;sE08uot%EB5B]",
 "key": "Y+jEa;QO!$Tvpg%*[q9gf*zxWIhC)Vj.FQ:KQq=NGytofdNFw.bB|5.[6I;GcW2i","serverSecret":"M;m=U5Zr$z}~2H4,Rp)lz-+i-6DUF;ddu1J^PCw$p{DR)%IqjNeYW-)q_jQ1|z*4 WllOZewsPh7Lg9hr3Lql6Yu73SvltqEcv5B6isSEx1v2z0EGMBWZCKEYiCYaETdzOwzZgu5TTQ1B2Up9RjfHnw== V2"}

Im nächsten Beispiel wird die Ausgabe als XML gewählt und ein Netzwerk, sowie ein Name angegeben.

E:\>SecretGeneratorCommand.exe --format=xml --label=Example --network=10.0.0.0/8 --network=192.168.0.0/16
Client:
<Value name="apiKey">/m~Ez_]w5acvr{T0x#G]4L!z6}QCXK#ecE[6:{1Vxw)1^l$|Q!lz=rr15.1#hqw=</Value>
<Value name="apiSecret">~i!Gw6NE//{(X=:q#6lto:B}yO#EWTmvOK6vp2d:|0vJ)qoormfM+2PXIrv*xI~@</Value>
Server:
<ListEntry>
        <Value name="label">Example</Value>
        <Value name="authorizedNetworks">10.0.0.0/8 192.168.0.0/16</Value>
        <Value name="key">/m~Ez_]w5acvr{T0x#G]4L!z6}QCXK#ecE[6:{1Vxw)1^l$|Q!lz=rr15.1#hqw=</Value>
        <Value name="secret">_ju89a_fZ8;}ggMd4=TOwbk7*Zu8-xg17GBJmZ8Y?i1X:S=5gSy:jUUBM7z5^70s gbPHbGjFvcx9JML2zf8NX8KDSUaoEfc/4fimIrVaRrquzR1rp6dwlw1W4WWUDI0eq7LAe4m9OwJXb277C5jHQA== V2</Value>
</ListEntry>