Zum Hauptinhalt springen

8. Diffie-Hellman Key Exchange (Diffie-Hellman-Schlüsselaustausch)

8. Diffie-Hellman Key Exchange (Diffie-Hellman-Schlüsselaustausch)

Der Diffie-Hellman (DH) Schlüsselaustausch liefert ein gemeinsames Geheimnis, das von keiner Partei allein bestimmt werden kann. Der Schlüsselaustausch wird mit einer Signatur mit dem Host-Schlüssel kombiniert, um Host-Authentifizierung bereitzustellen. Diese Schlüsselaustauschmethode bietet explizite Serverauthentifizierung, wie in Abschnitt 7 definiert.

Die folgenden Schritte werden zum Austausch eines Schlüssels verwendet. Dabei ist C der Client, S der Server, p eine große sichere Primzahl, g ein Generator für eine Untergruppe von GF(p), q die Ordnung der Untergruppe, V_S ist S's Identifikationszeichenfolge, V_C ist C's Identifikationszeichenfolge, K_S ist S's öffentlicher Host-Schlüssel, I_C ist C's SSH_MSG_KEXINIT-Nachricht und I_S ist S's SSH_MSG_KEXINIT-Nachricht, die vor Beginn dieses Teils ausgetauscht wurden.

  1. C generiert eine Zufallszahl x (1 < x < q) und berechnet e = g^x mod p. C sendet e an S.

  2. S generiert eine Zufallszahl y (0 < y < q) und berechnet f = g^y mod p. S empfängt e. Es berechnet K = e^y mod p, H = hash(V_C || V_S || I_C || I_S || K_S || e || f || K) (diese Elemente werden gemäß ihren Typen kodiert, siehe unten) und die Signatur s auf H mit seinem privaten Host-Schlüssel. S sendet (K_S || f || s) an C. Der Signiervorgang kann eine zweite Hash-Operation beinhalten.

  3. C überprüft, dass K_S wirklich der Host-Schlüssel für S ist (z.B. unter Verwendung von Zertifikaten oder einer lokalen Datenbank). C darf den Schlüssel auch ohne Überprüfung akzeptieren, dies macht jedoch das Protokoll gegen aktive Angriffe unsicher (kann aber aus praktischen Gründen kurzfristig in vielen Umgebungen wünschenswert sein). C berechnet dann K = f^x mod p, H = hash(V_C || V_S || I_C || I_S || K_S || e || f || K) und überprüft die Signatur s auf H.

Werte von 'e' oder 'f', die nicht im Bereich [1, p-1] liegen, DÜRFEN von keiner Seite gesendet oder akzeptiert werden. Wenn diese Bedingung verletzt wird, schlägt der Schlüsselaustausch fehl.

Dies wird mit den folgenden Nachrichten implementiert. Der Hash-Algorithmus zur Berechnung des Austausch-Hashs wird durch den Methodennamen definiert und heißt HASH. Der öffentliche Schlüsselalgorithmus zur Signierung wird mit den SSH_MSG_KEXINIT-Nachrichten ausgehandelt.

Zuerst sendet der Client Folgendes:

      byte      SSH_MSG_KEXDH_INIT
mpint e

Der Server antwortet dann mit Folgendem:

      byte      SSH_MSG_KEXDH_REPLY
string server public host key and certificates (K_S)
mpint f
string signature of H

Der Hash H wird als HASH-Hash der Verkettung der folgenden Elemente berechnet:

      string    V_C, the client's identification string (CR and LF
excluded)
string V_S, the server's identification string (CR and LF
excluded)
string I_C, the payload of the client's SSH_MSG_KEXINIT
string I_S, the payload of the server's SSH_MSG_KEXINIT
string K_S, the host key
mpint e, exchange value sent by the client
mpint f, exchange value sent by the server
mpint K, the shared secret

Dieser Wert wird Austausch-Hash genannt und wird zur Authentifizierung des Schlüsselaustauschs verwendet. Der Austausch-Hash SOLLTE geheim gehalten werden.

Der Signaturalgorithmus MUSS auf H angewendet werden, nicht auf die ursprünglichen Daten. Die meisten Signaturalgorithmen beinhalten Hashing und zusätzliches Padding (z.B. spezifiziert "ssh-dss" SHA-1-Hashing). In diesem Fall werden die Daten zuerst mit HASH gehasht, um H zu berechnen, und H wird dann als Teil des Signiervorgangs mit SHA-1 gehasht.

8.1. diffie-hellman-group1-sha1

Die Methode "diffie-hellman-group1-sha1" spezifiziert den Diffie-Hellman-Schlüsselaustausch mit SHA-1 als HASH und Oakley Group 2 [RFC2409] (1024-Bit-MODP-Gruppe). Diese Methode MUSS für Interoperabilität unterstützt werden, da alle bekannten Implementierungen sie derzeit unterstützen. Beachten Sie, dass diese Methode mit dem Ausdruck "group1" benannt ist, obwohl sie die Verwendung von Oakley Group 2 spezifiziert.

8.2. diffie-hellman-group14-sha1

Die Methode "diffie-hellman-group14-sha1" spezifiziert einen Diffie-Hellman-Schlüsselaustausch mit SHA-1 als HASH und Oakley Group 14 [RFC3526] (2048-Bit-MODP-Gruppe), und sie MUSS ebenfalls unterstützt werden.