Ho la seguente configurazione:
Un server e un client saranno connessi tramite tcp. Sia il server che il client hanno accesso alla chiave segreta già condivisa. Quando il client si connette al server, sia il client che il server devono conoscere la chiave, quindi devono utilizzare la stessa chiave per autenticarsi o fallire.
Mi è venuto in mente il seguente processo e vorrei sapere se c'è qualcosa di evidentemente sbagliato in esso che non ho visto. La vera crittografia non lo è
rilevante in questo caso.
Quindi questo è ciò che accade quando il client si connette:
- Il server genera un sale di 16 byte (salt1).
- Il server calcola hashServer1 = HASH (tasto + HASH (tasto + sale1)).
- Il server invia salt1 al client.
- I client calcolano usando il sale1 ricevuto hashClient1 = HASH (chiave + HASH (chiave + sale1)).
- Il client genera 16 byte salt (salt2).
- Il client calcola hashClient2 = HASH (tasto + HASH (tasto + sale2)).
- Il client invia (hashClient1 + salt2) al server.
- Il server controlla se ha ricevuto hashClient1 == hashServer1 e se non si rompe.
- Il server calcola usando salt2 hashServer2 = HASH (chiave + HASH (chiave + sale2)).
- Il server invia hashServer2 al client.
- Il client controlla se ha ricevuto hashServer2 == hashClient2 e se non si rompe.
Se non mi sbaglio, questo dovrebbe essere abbastanza sicuro quando si utilizza un algoritmo di hash strong. La chiave non viene mai inviata come testo in chiaro e, a causa del sale, i dati sono diversi ogni volta.
EDIT: modificato il sale utilizzato per l'hashing da saltX a HASH (chiave + saltX).