Sfondo
Sto cercando di sviluppare un'applicazione web in cui un utente sarà in grado di accedere utilizzando la propria password "P" e al momento del login può creare una password principale "MP". MP può essere utilizzato per aprire / chiudere un vault (in modo simile ai gestori di password) in cui l'utente può memorizzare informazioni riservate. Dopo aver svolto alcune ricerche sull'argomento, ho deciso di garantire quanto segue:
- La password principale MP non viene mai memorizzata su / inviata al server
- Tutte le crittografie / decrittografie vengono eseguite sul lato client (nel mio caso quello è il browser)
Ora come sto memorizzando il tasto MP '(definito sotto) in memoria, il vault è essenzialmente chiuso ogni volta che il browser viene aggiornato o l'utente apre il sito su una nuova scheda. Come posso mantenere aperto il vault fino a quando l'utente lo desidera? Cookie non è una soluzione in quanto ciò causerà l'invio di MP 'al server ad ogni richiesta; tuttavia, l'archiviazione locale HTML5 può essere una possibilità
Ora, se un hacker capita di accedere all'archivio locale, otterrebbe MP 'e può decodificare tutte le informazioni sensibili che lo utilizzano. Come soluzione ecco cosa sto pensando:
- Quando il vault viene aperto, il client richiede una sola chiave casuale 'Rk' dal server
- Il server genera Rk, lo memorizza nella sessione dell'utente e lo invia al client
- Il client usa Rk per crittografare MP 'per ottenere MP' '
- MP "" è memorizzato nella memoria locale HTML5 mentre Rk è conservato in memoria
- Quando necessario, MP '' può essere decifrato usando Rk e usato per le operazioni successive
- Durante l'aggiornamento del browser, il client recupera Rk dal server (il server restituisce semplicemente quello già memorizzato nella sessione)
- Rk è scaduto se l'utente chiude esplicitamente il vault o termina la sessione disconnettendosi
La domanda
Quanto è sicura questa soluzione? Qualche ovvio avvertimento che mi manca? Quale sarebbe l'approccio ideale per risolverlo?
Note aggiuntive
Per la tua comprensione, ecco una breve panoramica di come sto pianificando di soddisfare i miei bisogni:
- L'utente crea un nuovo MP
- MP è crittografato con un algoritmo di allungamento della chiave per produrre MP '
- MP 'è usato come chiave per crittografare un valore noto V per ottenere Vh (ovviamente V ≠ MP o MP')
- Vh è memorizzato sul server rispetto al record dell'utente
Vh ha 2 scopi:
- Indica che l'utente ha già creato un MP. Se ancora non c'è, posso chiedere all'utente di crearne uno nuovo
- Ogni volta che l'utente inserisce MP per aprire il vault, posso recuperare Vh dal server e provare a decrittarlo con MP '. Se la decrittografia ha esito positivo, suppongo che l'utente abbia inserito l'MP corretto
Come puoi immaginare ecco come dovrebbe funzionare il resto:
Ogni volta che l'utente desidera memorizzare / recuperare informazioni sensibili:
- Eseguono il login usando P e aprono il loro vault con MP
- Il client produce MP 'come accennato in precedenza
- Le informazioni sensibili vengono crittografate utilizzando MP 'prima di essere inviate e memorizzate sul server
- In base alle necessità dell'utente, le informazioni sensibili crittografate vengono recuperate dal server (così com'è)
- Il client utilizza MP 'per decrittografare i dati