Ho creato una chat tra due parti (usando c #), e mi chiedo quale tipo di debolezze ho trascurato.
Descrizione della sua funzionalità: Esistono due applicazioni individuali: Client (2 istanze di TcpClient che sono le parti comunicanti) e Server (TcpListener, l'inoltro di messaggi crittografati).
Nota: presumo che entrambi i computer contenenti l'applicazione client siano sicuri e non contengano malware o virus che potrebbero manomettere / monitorare la memoria, inserire chiavi, creare schermate, ecc ... D'altra parte l'applicazione Server può essere su qualsiasi computer che può essere potenzialmente 'compromesso' per mancanza di un termine migliore.
Ora la funzionalità del client sta registrando il messaggio dalla tastiera dell'utente, crittografandolo (utilizzando le classi AES256 c #) e inviando i dati al server. Sebbene prima che i messaggi possano essere inviati, i client si scambiano le chiavi pubbliche in base all'algoritmo Diffie Hellman key-exchange , ma tutte le comunicazioni tra i client funzionano attraverso il server. Essenzialmente il server è un gateway, un ponte tra i client, [1] , dopo che lo scambio di chiavi e il server di generazione di chiavi segrete riceve solo messaggi crittografati, non si preoccupa del suo contenuto, trasmette semplicemente il messaggio all'altro client, che lo decodifica localmente. [2] .
Ho pensato di avvolgere il mio NetworkStream in uno SslStream, per rendere il canale di comunicazione più sicuro, ma anche se qualcuno può 'leggere' lo stream non è in grado di leggere comunque la crittografia, quindi non penso che questo sia un difetto critico per mantenere il SECRET-MESSAGE sicuro.
Non sto proteggendo il mio file .exe in alcun modo (né nel server né nei client) poiché non penso che ci sia una protezione al 100% se il computer è già stato compromesso. In altre parole, il cattivo può decompilare il mio .exe, quanto è grave e dovrei prendere qualche tipo di precauzione? Sebbene le chiavi segrete generate da DH siano conservate localmente nei computer (generate di nuovo ogni volta che viene stabilita una connessione tra client) poiché presumo che il computer client sia sicuro, non dovrebbero esserci problemi con questo, giusto?
Punti deboli che ho notato:
[1]: ha un accesso diretto alle informazioni dei clienti (indirizzo IP, quando è stato inviato il messaggio, anche quanti caratteri il messaggio conteneva (~ di 8 byte)).
[2]: l'applicazione server può essere temperata, imitare il secondo client e acquisire il canale, inviare la propria chiave pubblica e ricevere la chiave pubblica di altri client, sostituendo efficacemente il secondo client. Questo può essere facilmente risolto se le parti si scambiano un saluto in qualsiasi altro software di comunicazione (skype, ecc.) E confermano che sono collegati tra loro (i messaggi vengono ricevuti nello stesso momento in cui vengono inviati, ecc.)
P.S. Sono a conoscenza di alcuni punti deboli che ho menzionato sopra, ma quelli non sono critici, vorrei sapere se ci sono dei difetti critici che mi sono sfuggiti, e come valuteresti questa configurazione da 0-10? Cosa posso aggiungere / modificare apportare miglioramenti a ciò che ho già / correggere i difetti.