Quindi sto costruendo un sistema client / server che è simile all'idea di posta elettronica in cui i client scambiano messaggi attraverso il server con i seguenti requisiti principali (si noti che i client sono pre-registrati al server e devono autenticarsi prima di qualsiasi trasmissione di messaggi):
- Ogni messaggio deve essere crittografato e nessuno può leggerlo tranne il mittente e il destinatario.
- Il tempo di crittografia non dovrebbe richiedere molto tempo
- Il messaggio deve essere memorizzato su entrambi i lati del client e del server (messaggio crittografato una volta creato anche se il client decide di memorizzarlo e inviarlo in un secondo momento: Crittografia a livello di applicazione ).
Ho proposto tre soluzioni per farlo e sto ancora studiando i pro e i contro di ciascuna soluzione se non ti dispiace aiutarmi:
A- Utilizzo della crittografia a chiave simmetrica con il server Ogni client ha una chiave segreta condivisa con il server Il mittente A crittografa il loro messaggio con la chiave segreta condivisa KA > il server decrittografa il messaggio con KA e lo ricodifica nuovamente con la chiave segreta condivisa del ricevitore B KB > il ricevitore B decrittografa il messaggio con la sua chiave condivisa KB
La sfida in questa soluzione è che il server deve decodificare e quindi crittografare nuovamente il messaggio. è sicuro o no? perché?
B- Utilizzo della crittografia a chiave ibrida simmetrica e asimmetrica con il server
Il server memorizza 2 diversi tipi di chiave per ogni cliente registrato
- Chiave condivisa tra server e client
- Chiave pubblica del client
• Quando il mittente A vuole crittografare un messaggio sul ricevitore B
- Un comunicare con il server e ottenere B chiave pubblica Bpk utilizzando il server condiviso segreto Ka-s
- A genera un segreto condiviso per lui e B e crittografa il messaggio con esso Ka-b (messaggio)
- A crittografa il segreto condiviso generato con la chiave pubblica B e lo aggiunge al messaggio crittografato Ka-b (messaggio), Bpk (Ka-b)
• Quando B riceve un messaggio crittografato
- B ottiene Ka-b decifrandolo usando la sua chiave privata Bpri (Bpri (Ka-b))
- B decrittografa il messaggio utilizzando il segreto condiviso Ka-b
La sfida in questa soluzione è l'overhead per crittografare il messaggio in cui il mittente deve generare una chiave ogni volta che vuole inviare un messaggio.
C- Utilizzo simmetrico senza coinvolgimento del server:
Ogni client registrato ha una chiave condivisa con qualsiasi altro client registrato. Se A vuole inviare un messaggio a B, può recuperare la chiave condivisa memorizzata Ka-b e crittografare il messaggio con esso quindi caricarlo sul server.
In questa soluzione il server non sarà in grado di leggere il messaggio e quindi meno sicurezza richiesta sul server.
La sfida qui è la memorizzazione di tutte le chiavi su ogni applicazione client e la gestione delle chiavi (sincronizzazione tra due client quando si rinnova una chiave condivisa scaduta)
Esistono soluzioni migliori per soddisfare entrambi i requisiti con un'elevata sicurezza?