Crittografia asimmetrica / end-to-end per l'app di messaggistica web

7

Sfondo

Sto provando a progettare un'applicazione web sicura e sostenibile per la messaggistica. Lo scopo è imparare a creare un'applicazione web sicura.

Si suppone che l'applicazione sia scritta in Javascript per i client Web e PHP per il lato server.

I client che utilizzano l'applicazione Web eseguiranno l'accesso per poter utilizzare il servizio su un'ampia varietà di dispositivi.

I client possono quindi inviare messaggi ad altri utenti, in modo sicuro senza che nessuna mano di mezzo possa leggere il messaggio in chiaro. Non voglio che il server sia in grado di leggere i messaggi, quindi la crittografia principale dovrà avvenire sul lato client.

Pensieri

  • SSL / TLS: garantisce comunicazioni valide con il server
  • RSA - crittografia asimmetrica - per crittografare le chiavi di crittografia
  • AES - per crittografare quantità sconosciute di dati, più comunemente testo semplice

L'intera applicazione sarà ovviamente costruita utilizzando SSL / TLS per consentire comunicazioni sicure e convalidate tra il client e il server.

Per garantire che solo le parti previste abbiano accesso ai dati inviati, viene utilizzata la crittografia asimmetrica. Ogni client ha le proprie chiavi private archiviate sul lato client e le loro chiavi pubbliche memorizzate sul server che sono state associate all'utente in un database.

Quando Alice vuole scrivere un messaggio a Bob, lei crittografa i dati con una chiave AES strong, dal momento che RSA può gestire solo una dimensione di dati finita. Per garantire che solo Bob possa leggere il messaggio, recupera la chiave pubblica di Bob dal database e crittografa la sua chiave AES generata con esso. Il messaggio crittografato viene quindi inviato al server, insieme alla chiave utilizzata, crittografato con la chiave pubblica di Bob.

Bob recupera questo messaggio / coppia di chiavi dal server. Poiché Bob ha la chiave privata relativa alla chiave pubblica utilizzata per crittografare la chiave del messaggio di Alice, lui e solo lui possono recuperare la chiave utilizzata in testo normale. Utilizzando questa chiave non crittografata, può quindi decrittografare il messaggio principale e leggerlo come testo semplice.

Le preoccupazioni

La coppia di chiavi pubblica e privata deve essere generata lato server. Ciò impone la chiave privata da inviare all'utente per l'uso. Come può essere sicuro, dal momento che qualsiasi intermediario può recuperare la chiave privata per utilizzarla ulteriormente per decrittografare tutti i messaggi di Alice.

Per garantire che il server non sappia quali messaggi gli utenti inviano, non può avere accesso / memorizzare le chiavi private. Ciò impone la memorizzazione delle chiavi lato client - utilizzando Javascript, una lingua e una piattaforma raramente associate alla sicurezza o alla persistenza dei dati protetti. Poiché la sicurezza è la mia preoccupazione principale, non memorizzare correttamente le chiavi private è un grosso problema.

Diciamo che l'utente vuole accedere e utilizzare l'applicazione da un altro dispositivo, quindi la chiave privata deve apparire "magicamente" anche lì. Costringendo il server a memorizzare le chiavi private comunque. Esiste un altro modo per eseguire questa crittografia / gestione delle chiavi?

Domande di chiarimento

Se gli argomenti di cui sopra sono troppo lunghi per essere letti, confusi o se hai fretta, di seguito sono riportate domande semplificate.

Come posso garantire che i messaggi inviati vengano letti solo da quelle due parti?

Come posso garantire ai miei utenti che I / the server o chiunque altro sia in grado di leggere i loro messaggi?

Se il loro è un modo di archiviare le chiavi private in sicurezza sul lato client, quanto è grave?

    
posta Alex 26.03.2015 - 12:34
fonte

1 risposta

3

Penso che ci sia un ulteriore problema / sfida con il tuo schema: Oltre al problema di avere le coppie di chiavi generate dal server, questo schema consente anche un attacco uomo nel mezzo: A chiede la chiave di B, le risposte del server con la propria chiave C. Ora il server può decodificare, leggere e crittografare di nuovo per B e inviare il nuovo testo cifrato a B. Né A né B si accorgeranno mai finché la comunicazione è terminata usando il server. Per evitare ciò, è necessario disaccoppiare il server di gestione delle chiavi e il server dei messaggi. Nel migliore dei casi, si utilizzerà un server di chiavi di comunità attivo come quelli per pgp, per esempio.

In ogni caso, supponendo che la gestione delle chiavi sia eseguita in modo onesto, la crittografia ibrida dovrebbe funzionare.

Riguardo alla generazione delle chiavi, dai un'occhiata a CryptoJS . Se ricordo bene, è (quasi) una struttura crittografica a pieno titolo che può anche generare chiavi. Puoi utilizzare l'html5 API di archiviazione locale per archiviare la chiave lato client.

    
risposta data 27.03.2015 - 13:20
fonte