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?