Quindi pensavo alla comunicazione client-server e a come mantenerlo privato, specialmente da attacchi man-in-the-middle. Ho trovato uno schema che sono sicuro che esiste già, ma non sono riuscito a trovare risultati di ricerca sufficientemente concreti per saperne di più.
È iniziato pensando che quando un client si connette al server, vorrebbe stabilire un canale di comunicazione sicuro, in modo che il client possa generare una coppia di chiavi privata / pubblica e inviare la chiave pubblica al server. Il problema è ottenere la chiave pubblica sul server in modo sicuro (altrimenti un uomo nel mezzo potrebbe decrittografare tutti i messaggi usando la chiave pubblica che ha afferrato dal primo messaggio, allegare la propria chiave pubblica al messaggio, usare la chiave privata corrispondente per decodificare la risposta e, dopo averla memorizzata, re-cifrare con l'effettiva chiave pubblica del cliente).
Quindi ho pensato ad una possibile soluzione: il client prima riceve una chiave pubblica dal server, che userà per crittografare la propria chiave pubblica. Il MitM può intercettare tutti i messaggi, ma non sarà in grado di decodificare nessuno di essi - solo il server effettivo può decrittografare la richiesta del client e la risposta può essere decifrata dal solo client effettivo. Una volta che il server conosce la chiave pubblica del client, lo memorizza in modo sicuro e lo utilizza per crittografare qualsiasi ulteriore comunicazione.
Ho alcune domande correlate.
- Che cos'è questo tipo di sicurezza / handshaking chiamato?
- Ho sentito la parola nonce ma ho ragione che si tratta di impedire attacchi di riproduzione e non il problema MitM che sto cercando di risolvere?
- La chiave iniziale che il server invia al client dovrebbe essere fissa e possibilmente pubblicata da qualche parte, in modo che i clienti possano saltare il passaggio "Dammi il tuo passaggio chiave pubblico" nelle sessioni successive? O dovrebbe essere una chiave appena generata per ogni cliente ad ogni nuova richiesta di sessione?
- Al contrario, se la chiave pubblica del client cambia con ogni sessione o il client può riutilizzare la stessa chiave una volta che è stata comunicata in sicurezza al server?
- Quali sono i rischi a questo, a parte l'ovvio fallimento da parte di una delle parti coinvolte di mantenere private le chiavi private?
Sono sicuro che questo è abbastanza comune e probabilmente già come funzionano molti schemi di autenticazione, quindi piuttosto che rispondere a tutte queste domande separatamente, sarei felice se qualcuno potesse fornirmi la terminologia corretta (ho provato alcune combinazioni di parole chiave come "client / server", "crittografia asimmetrica", "stabilire una sessione", ma sono troppo generiche per trovare qualcosa di utile). E anche se questo è un SE teorico, immagino che come con tutta la buona sicurezza non si debba implementare la propria implementazione, quindi qualsiasi codice di esempio di una corretta applicazione client / server (ad es. In PHP) usando librerie ben consolidate sarebbe il benvenuto.