8. Diffie-Hellman Key Exchange (Échange de clés Diffie-Hellman)
8. Diffie-Hellman Key Exchange (Échange de clés Diffie-Hellman)
L'échange de clés Diffie-Hellman (DH) fournit un secret partagé qui ne peut être déterminé par aucune des parties seule. L'échange de clés est combiné avec une signature avec la clé d'hôte pour fournir l'authentification de l'hôte. Cette méthode d'échange de clés fournit une authentification explicite du serveur telle que définie dans la Section 7.
Les étapes suivantes sont utilisées pour échanger une clé. Dans ce processus, C est le client, S est le serveur, p est un grand nombre premier sûr, g est un générateur pour un sous-groupe de GF(p), q est l'ordre du sous-groupe, V_S est la chaîne d'identification de S, V_C est la chaîne d'identification de C, K_S est la clé d'hôte publique de S, I_C est le message SSH_MSG_KEXINIT de C et I_S est le message SSH_MSG_KEXINIT de S qui ont été échangés avant le début de cette partie.
-
C génère un nombre aléatoire x (1 < x < q) et calcule e = g^x mod p. C envoie e à S.
-
S génère un nombre aléatoire y (0 < y < q) et calcule f = g^y mod p. S reçoit e. Il calcule K = e^y mod p, H = hash(V_C || V_S || I_C || I_S || K_S || e || f || K) (ces éléments sont encodés selon leurs types, voir ci-dessous), et la signature s sur H avec sa clé d'hôte privée. S envoie (K_S || f || s) à C. L'opération de signature peut impliquer une seconde opération de hachage.
-
C vérifie que K_S est vraiment la clé d'hôte pour S (par exemple, en utilisant des certificats ou une base de données locale). C est également autorisé à accepter la clé sans vérification, cependant, cela rendra le protocole non sécurisé contre les attaques actives (mais peut être souhaitable pour des raisons pratiques à court terme dans de nombreux environnements). C calcule ensuite K = f^x mod p, H = hash(V_C || V_S || I_C || I_S || K_S || e || f || K), et vérifie la signature s sur H.
Les valeurs de 'e' ou 'f' qui ne sont pas dans la plage [1, p-1] NE DOIVENT PAS être envoyées ou acceptées par l'une ou l'autre partie. Si cette condition est violée, l'échange de clés échoue.
Ceci est implémenté avec les messages suivants. L'algorithme de hachage pour calculer le hachage d'échange est défini par le nom de la méthode et est appelé HASH. L'algorithme de clé publique pour la signature est négocié avec les messages SSH_MSG_KEXINIT.
Premièrement, le client envoie ce qui suit:
byte SSH_MSG_KEXDH_INIT
mpint e
Le serveur répond ensuite avec ce qui suit:
byte SSH_MSG_KEXDH_REPLY
string server public host key and certificates (K_S)
mpint f
string signature of H
Le hachage H est calculé comme le hachage HASH de la concaténation des éléments suivants:
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
Cette valeur est appelée le hachage d'échange et elle est utilisée pour authentifier l'échange de clés. Le hachage d'échange DEVRAIT être gardé secret.
L'algorithme de signature DOIT être appliqué sur H, pas sur les données originales. La plupart des algorithmes de signature incluent le hachage et un remplissage supplémentaire (par exemple, "ssh-dss" spécifie le hachage SHA-1). Dans ce cas, les données sont d'abord hachées avec HASH pour calculer H, puis H est haché avec SHA-1 dans le cadre de l'opération de signature.
8.1. diffie-hellman-group1-sha1
La méthode "diffie-hellman-group1-sha1" spécifie l'échange de clés Diffie-Hellman avec SHA-1 comme HASH, et Oakley Group 2 [RFC2409] (groupe MODP de 1024 bits). Cette méthode DOIT être prise en charge pour l'interopérabilité car toutes les implémentations connues la prennent actuellement en charge. Notez que cette méthode est nommée en utilisant l'expression "group1", même si elle spécifie l'utilisation d'Oakley Group 2.
8.2. diffie-hellman-group14-sha1
La méthode "diffie-hellman-group14-sha1" spécifie un échange de clés Diffie-Hellman avec SHA-1 comme HASH et Oakley Group 14 [RFC3526] (groupe MODP de 2048 bits), et elle DOIT également être prise en charge.