Decrittografia dei segreti multiutente nell'applicazione web multi-tenant

1

Attualmente sto sviluppando un'applicazione web che implementa un servizio di archiviazione dei messaggi. È necessario che i messaggi non siano leggibili dallo sviluppatore / amministratori di sistema, e una cosa bella sarebbe trasmettere i messaggi crittografati end-to-end. I messaggi dovrebbero essere leggibili da tutte le persone in un 'affare'. I messaggi che devono essere archiviati provengono da fonti esterne come API o e-mail. Questi messaggi esterni in arrivo dovrebbero essere considerati classificati. gli utenti dovrebbero essere in grado di accedere da qualsiasi browser.

Nella mia attuale implementazione del test sulla creazione di un 'business' verrà generato un RSA Keypair. La chiave pubblica verrà salvata nel database associato al "business" e la chiave privata verrà crittografata utilizzando un hash derivato dalla password dell'utente e archiviata associata all'utente. Quando altri utenti vengono aggiunti all'azienda, la chiave privata decrittata dell'utente connesso verrà crittografata utilizzando il nuovo hash derivato da password degli utenti e archiviata con il nuovo utente.

I messaggi in arrivo verranno crittografati dall'azienda come chiave pubblica.

Quando si interrogano messaggi, questi verranno decrittografati dalla chiave privata dell'utente (la chiave privata sarà la stessa per tutti gli utenti dell'azienda, eccetto che sono crittografati con un hash derivato da password differente). Pertanto, quando un utente accede alla password verrà utilizzato per ottenere l'hash derivato, decrittografare la chiave pubblica e memorizzarlo in una sessione lato server. Da quel momento i messaggi possono essere decodificati e pubblicati.

L'unico problema è: leggendo i file di sessione, gli amministratori di sistema sono ancora in grado di decodificare i messaggi degli utenti registrati. C'è qualche protocollo per risolvere questo?

Ho pensato anche alla decrittazione lato client (inviando agli utenti la chiave privata crittografata al browser, derivando la chiave dalla password sul lato client, decifrando la chiave privata usando quella, e salvando temporaneamente la chiave privata decodificata in localstorage e decrittografare i messaggi dall'api usando quella chiave privata decrittata sul lato client, ma sta memorizzando una chiave privata decodificata nel browser sicuro?

    
posta Ruud Schuurmans 22.09.2017 - 23:57
fonte

3 risposte

0

Invece di usare il tuo sistema di sessione per tenere traccia della chiave, potresti provare un'alternativa.

Assegna al tuo utente un cookie sicuro limitato nel tempo, limitato nel dominio e limitato nel percorso con un "segreto di decrittazione" appena casuale che generi quando controlli le credenziali dell'utente nel gruppo aziendale.

Se la password è valida, prima del completamento della procedura di accesso, decrittografare la chiave privata con la password e ricodificarla con il "segreto di decrittografia". Memorizzare la chiave privata reencrypted nella sessione. Il tuo utente è ora indirizzato alla tua pagina webmail normalmente e le variabili utilizzate nella fase di login sono perse.

Ora, ogni volta che l'utente naviga nel tuo sito webmail, invierà costantemente il "segreto della decrittografia" come cookie. Questo può essere usato dallo script sul lato server, insieme alla chiave privata reencrypted, per decrittografare qualsiasi e-mail, se necessario.

Tuttavia, come @Vitaly menzionato, non si ottiene la perfetta ignoranza sul lato server. Un amministratore di sistema rogue potrebbe, se davvero lo desidera, catturare i cookie installando e indirizzando un utente a una pagina specifica. Potrebbe anche catturare i pacchetti HTTP, soprattutto se non sono già crittografati con TLS (il che renderebbe la maggior parte inutile). Lui / lei potrebbe anche ispezionare la memoria del server. Puoi anche ottenere la password con uno qualsiasi di questi metodi, dato che sei all'interno del server.

Tuttavia, questo schema garantisce che il segreto di decrittografia non verrà memorizzato sul server e non richiede alcuna decrittazione sul lato client, nello stesso modo in cui le password non sono in genere memorizzate nel database. Richiederebbe all'amministratore di sistema uno sforzo effettivo per leggere le e-mail, ad esempio, non si potrebbe semplicemente inciampare sulla chiave privata. E questo potrebbe essere abbastanza buono per il tuo modello di minaccia.

    
risposta data 25.09.2017 - 19:07
fonte
0

The only problem is: by reading the session files, sysadmins are still able to decrypt messages of logged in users. Is there any protocol to solve this?

Stai chiedendo l'impossibile - per un sistema che fornirebbe agli utenti servizi di decrittografia e crittografia senza mantenere alcuna conoscenza su come lo fa, in qualsiasi momento (altrimenti gli amministratori di sistema saranno in grado di decrittografare anche i messaggi!).

Devi decidere chi ti fidi e in quale misura, perché devi fidarti di qualcuno - alla fine è l'hardware che esegue il tuo codice, non tu stesso.

    
risposta data 23.09.2017 - 04:48
fonte
0

Il maggior rischio di archiviare il lato client chiave è un attacco XSS.

La sicurezza della tua applicazione dipende in gran parte da ciò che stai evitando con successo. Questo potrebbe rivelarsi particolarmente difficile in quanto un attaccante ha presumibilmente un ampio margine di manovra nella creazione di un messaggio in quanto le e-mail hanno un'ampia varietà di caratteri e codifiche consentite.

Faccio un bel pò di sviluppo .net e il numero di volte in cui vedo una domanda sullo stackoverflow come "Come posso visualizzare il contenuto HTML fornito dall'utente sul mio sito web" con una risposta come "Usa @Html.Raw() " è incredibile. La maggior parte dei framework web ha meccanismi di escape eccellenti per prevenire gli attacchi XSS, ma molti sviluppatori non ne sono consapevoli o quando li ignorano attivamente.

Non sto dicendo che non è possibile visualizzare correttamente un'e-mail in formato html su una pagina web senza analizzare possibili attacchi, solo che sarebbe molto facile fare un errore.

Nel complesso, ritengo che archiviare la chiave a livello locale mi renderebbe piuttosto nervoso, dato il probabile contenuto del messaggio e il fatto che ogni utente malintenzionato deve solo mandare email a un utente per inserire potenzialmente il codice.

Detto questo, la chiave di decrittografia è utile solo se hai accesso ai contenuti crittografati e un attacco XSS mirato contro il tuo sito web potrebbe probabilmente leggere comunque tutti i messaggi di un utente.

    
risposta data 23.09.2017 - 21:59
fonte

Leggi altre domande sui tag