Ho letto un sacco di risposte e tutorial su come la crittografia lato client non è una buona idea a causa di molti motivi elencati principalmente in Crittografia Javascript considerato dannoso articolo. Alcuni fatti
- L'app utilizzerà HTTPS
- Ci sarà la convalida lato server e client
- Non esiste alcun collegamento tra la password dell'utente e il seguente scenario
- Il lato server è un servizio web RESTful (nessuna sessione di sorta)
- Il back-end invia JWT agli utenti
- Il back-end potrebbe consentire sia l'utente / password sia l'oauth (ad esempio fb, twitter, ecc.)
Che cosa voglio crittografare nel lato client?
L'utente inserirà alcune informazioni personali (ad esempio nome, indirizzo, numero di telefono) tramite un'app di frontend (ad es. Vue.js, Angular, React, ecc.)
Come immagino funzionerà?
L'utente seleziona i campi (cioè i bit e le informazioni delle informazioni personali), quindi fa clic su Cripta. L'utente fornirà una chiave di crittografia. Il frontend userà un po 'di js crypto library
e cripterà le informazioni e le sostituirà in DOM
e informerà l'utente sul backup della chiave di crittografia.
Come posso comunicare queste informazioni al server?
Il frontend eseguirà una richiesta HTTP PUT
o POST
con le informazioni personali (sia semplici / di testo o incomprensibili) sul server. Il server non si preoccupa dei dati in arrivo (ad eccezione di SQL o altre forme di iniezioni) e lo memorizza nel database immediatamente. Questa richiesta non conterrà il encryption key
ma, potrebbe contenere un flag / s per specificare quali campi sono stati crittografati.
Come decifrare?
Quando l'utente richiede l'informazione, il backend restituisce qualsiasi cosa ci sia nel server così com'è. Le informazioni se crittografate verranno visualizzate come gibberish
per l'utente. Usando i flag, il sistema fornirà loro l'opzione decrypt
e facendo clic su questo si chiederebbe loro di inserire encryption key
e la decrittografia localmente.
Scopo ultimo?
Prima di tutto, ci impegneremo a fare in modo che server e database e tutto siano a prova di proiettile ma, se per qualche motivo il server viene violato, l'hacker finirebbe con un sacco di informazioni legate a parole senza senso informazione personale.
La domanda definitiva
Leggendo attraverso internet, la crittografia in Javascript
è strongmente scoraggiata quindi, le mie domande
- Tenendo conto dello scenario e dei requisiti di cui sopra, quali sono i rischi che impongono la suddetta implementazione?
- Esiste un approccio che raccomandi, in cui solo l'utente ha il controllo della chiave, non memorizzato da nessuna parte?
- Se dovessi crittografare queste informazioni nel back-end, come posso comunicare la
encrypt key
in modo sicuro con l'utente? Forse crittografare le informazioni utilizzando la chiavexyz
e quindi fornire un collegamento sicuro all'utente per fare clic e visualizzare la chiave di crittografiaxyz
, ...? - Quali altri suggerimenti ci sono per la crittografia front-end e back-end?
Vorrei dare all'utente la certezza che solo loro sanno come decrittografare la chiave. Come posso ottenerlo in un modo più efficiente? Senza dover archiviare e gestire la chiave di crittografia?
Aggiornamento 17 luglio 2018
Sulla base della risposta accettata, ho scritto un post medio su come ho implementato la soluzione qui è il link link