Crittografia nella chat peer to peer

3

Per un compito a casa sto sviluppando un servizio di chat che sarà in grado di comunicare all'interno di una singola rete. Il canale di comunicazione deve essere crittografato con RSA.

Dovrei generare keypair su ogni client e, quando un client tenta di comunicare, chiedere la chiave pubblica? È sicuro?

Non è un duplicato. Voglio sapere cosa succede se qualcuno non può cambiare i pacchetti sulla rete e offre anche l'autenticazione.

    
posta MSD561 07.12.2015 - 09:46
fonte

2 risposte

4

Risponderò alla tua domanda in due parti:

The communication channel should be encrypted with RSA. How can I do that?

RSA è davvero lento per crittografare interi messaggi. Il solito modo è di crittografare il messaggio con un codice simmetrico come AES, quindi cifrare la chiave simmetrica usando la chiave pubblica RSA del destinatario.

Detto questo, ci sono molti di piccoli dettagli da correggere, quindi ti consiglio di usare un'implementazione precostruita. Infatti, usa solo SSL / TLS, casi d'uso come il tuo sono esattamente ciò per cui sono fatti. OpenSSL nell'implementazione TLS più comune, è facile da usare e si prenderà cura di tutta la crittografia per te. Cercare su google come "introduzione alla programmazione openssl" dovrebbe iniziare.

EDIT: come sottolineato da @Volker nei commenti, molti comuni client di messaggistica istantanea come Pidgin e Kopete utilizzano la libreria Off -the-Record Messaging che è un protocollo di crittografia specificamente progettato per gli instant messenger. OTR utilizza PGP come sistema di crittografia sottostante. C'è una libreria OTR per C disponibile qui e un Libreria Java qui .

Ora per la seconda parte della tua domanda:

Generate keypairs on every client and when a client tries to communicate, ask for public key? It is this safe?

Lascia che l'handshake SSL / TLS si occupi di tutto questo. Utilizza un protocollo di scambio di chiavi chiamato Diffie-Hellman che risolve abbastanza bene il problema dello scambio di chiavi .

Una cosa a cui vuoi pensare è se hai bisogno di un'autenticazione strong, cioè se sei preoccupato o meno delle persone che si impersonano con altri utenti. In tal caso, dovrai inserire le chiavi pubbliche di tutti in certificati che legano ciascuna chiave pubblica a una persona specifica. Questa è una configurazione molto più complicata che richiederà una sorta di Public Key Infrastructure - o dovrai configurare un < a href="https://en.wikipedia.org/wiki/Certificate_authority"> Autorità di certificazione server (puoi farlo con OpenSSL ), o avere un sistema web-of-trust come fa PGP. Se decidi di seguire questa strada, puoi trovare informazioni su Google, su questo scambio o puoi pubblicare nuove domande sull'impostazione di un'infrastruttura PKI per la tua rete di chat.

    
risposta data 07.12.2015 - 15:47
fonte
1

Ho già scritto questo tipo di servizio chat. Quando un utente si unisce al server, deve essere inviata la chiave pubblica per il client. Quindi, ogni volta che viene avviato un messaggio privato, il server può distribuire le chiavi pubbliche ai rispettivi clienti che stanno comunicando.

Devi ricordare che l'uso di RSA per crittografare interi messaggi di chat sarà lento. È per questo che in genere RSA viene utilizzato in uno scambio di chiavi per stabilire una chiave di crittografia simmetrica a lungo termine. Lo scambio di chiavi stabilisce anche algoritmi e parametri di sicurezza. Ciò consente di stabilire comunicazioni sicure per metodi di crittografia più rapidi senza compromettere la sicurezza.

Effettua il checkout Funzionamento di SSL / TLS per un'analisi approfondita come funziona un protocollo sicuro. Tieni presente che scrivere i tuoi protocolli sicuri ti apre vulnerabilità. "Perché non dovremmo rollare o possedere?" risolve questi problemi .

    
risposta data 07.12.2015 - 14:58
fonte

Leggi altre domande sui tag