8. Diffie-Hellman Key Exchange (Scambio di chiavi Diffie-Hellman)
8. Diffie-Hellman Key Exchange (Scambio di chiavi Diffie-Hellman)
Lo scambio di chiavi Diffie-Hellman (DH) fornisce un segreto condiviso che non può essere determinato da nessuna delle due parti da sola. Lo scambio di chiavi è combinato con una firma con la chiave host per fornire l'autenticazione dell'host. Questo metodo di scambio di chiavi fornisce l'autenticazione esplicita del server come definito nella Sezione 7.
I seguenti passaggi vengono utilizzati per scambiare una chiave. In questo processo, C è il client, S è il server, p è un grande numero primo sicuro, g è un generatore per un sottogruppo di GF(p), q è l'ordine del sottogruppo, V_S è la stringa di identificazione di S, V_C è la stringa di identificazione di C, K_S è la chiave host pubblica di S, I_C è il messaggio SSH_MSG_KEXINIT di C e I_S è il messaggio SSH_MSG_KEXINIT di S che sono stati scambiati prima dell'inizio di questa parte.
-
C genera un numero casuale x (1 < x < q) e calcola e = g^x mod p. C invia e a S.
-
S genera un numero casuale y (0 < y < q) e calcola f = g^y mod p. S riceve e. Calcola K = e^y mod p, H = hash(V_C || V_S || I_C || I_S || K_S || e || f || K) (questi elementi sono codificati secondo i loro tipi, vedi sotto), e la firma s su H con la sua chiave host privata. S invia (K_S || f || s) a C. L'operazione di firma può comportare una seconda operazione di hashing.
-
C verifica che K_S sia realmente la chiave host per S (ad esempio, utilizzando certificati o un database locale). C è anche autorizzato ad accettare la chiave senza verifica, tuttavia, ciò renderà il protocollo non sicuro contro attacchi attivi (ma può essere desiderabile per ragioni pratiche a breve termine in molti ambienti). C calcola quindi K = f^x mod p, H = hash(V_C || V_S || I_C || I_S || K_S || e || f || K), e verifica la firma s su H.
I valori di 'e' o 'f' che non sono nell'intervallo [1, p-1] NON DEVONO essere inviati o accettati da nessuna delle due parti. Se questa condizione viene violata, lo scambio di chiavi fallisce.
Questo viene implementato con i seguenti messaggi. L'algoritmo di hash per calcolare l'hash di scambio è definito dal nome del metodo ed è chiamato HASH. L'algoritmo a chiave pubblica per la firma viene negoziato con i messaggi SSH_MSG_KEXINIT.
Per prima cosa, il client invia quanto segue:
byte SSH_MSG_KEXDH_INIT
mpint e
Il server risponde quindi con quanto segue:
byte SSH_MSG_KEXDH_REPLY
string server public host key and certificates (K_S)
mpint f
string signature of H
L'hash H viene calcolato come hash HASH della concatenazione dei seguenti elementi:
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
Questo valore è chiamato hash di scambio ed è utilizzato per autenticare lo scambio di chiavi. L'hash di scambio DOVREBBE essere mantenuto segreto.
L'algoritmo di firma DEVE essere applicato su H, non sui dati originali. La maggior parte degli algoritmi di firma include l'hashing e padding aggiuntivo (ad esempio, "ssh-dss" specifica l'hashing SHA-1). In tal caso, i dati vengono prima sottoposti a hash con HASH per calcolare H, quindi H viene sottoposto a hash con SHA-1 come parte dell'operazione di firma.
8.1. diffie-hellman-group1-sha1
Il metodo "diffie-hellman-group1-sha1" specifica lo scambio di chiavi Diffie-Hellman con SHA-1 come HASH e Oakley Group 2 [RFC2409] (gruppo MODP a 1024 bit). Questo metodo DEVE essere supportato per l'interoperabilità poiché tutte le implementazioni note lo supportano attualmente. Si noti che questo metodo è denominato utilizzando la frase "group1", anche se specifica l'uso di Oakley Group 2.
8.2. diffie-hellman-group14-sha1
Il metodo "diffie-hellman-group14-sha1" specifica uno scambio di chiavi Diffie-Hellman con SHA-1 come HASH e Oakley Group 14 [RFC3526] (gruppo MODP a 2048 bit), e DEVE essere anch'esso supportato.