Sto lavorando su una piattaforma di messaggistica sicura e sto avendo problemi a capire come proteggere dagli attacchi MITM.
La mia configurazione corrente può essere riassunta come segue: Il server mantiene una chiave privata e rende pubblica la chiave pubblica che può quindi essere installata nei client. Quando si inviano dati al server, questo deve essere cifrato con la chiave pubblica che verrà quindi decrittografata sul server e crittografata nuovamente con la chiave privata prima di essere inoltrata al destinatario.
Schizzo ASCII della situazione normale:
Mittente - Encrypted, can be intercepted but not deciphered
- > Server - Encryped with the private key, if intercepted can be broken since the public key is public
- > Destinatario
Da quella sola informazione dovremmo vedere che la parte Sender- > Server è sicura e un uomo nel mezzo non farebbe nulla (Provare qualcosa danneggerà il protocollo e la connessione verrà interrotta). Tuttavia, la parte Server- > Recipient non è sicura contro gli attacchi MITM .. affatto!
Per peggiorare le cose, quando i dati vengono inviati, viene anche rispedito al mittente per confermare che è stato inviato, compromettendo così entrambi i client agli attacchi MITM.
Quindi ecco la mia domanda, al momento della connessione iniziale, in che modo il server può dimostrare che è davvero il vero server?
Scenari di esempio:
Evil Server non deve essere in grado di fingere di essere il Real Server Client - > Evil Server - > Real Server
Real Server deve essere in grado di dimostrare di essere, in effetti, il Real Server. Client - > Real Server
Note: Questo è fatto su TCP. Sto cercando una soluzione che non richieda una infrastruttura pesante, ma posso consentire l'utilizzo di un paio di server esterni per controllare (tuttavia anche questi avranno bisogno di dimostrare la loro autenticità).