Cripta i dati utente su DB [chiuso]

4

Sto sviluppando un server (Java + Spring) e voglio crittografare i dati sensibili degli utenti sul database, usando una chiave specifica per ognuno.

Ho pensato di crittografare i dati dell'utente usando la loro password come base per la chiave ma ...

  1. Sto solo memorizzando le password hash (bcrypt) nel database
  2. L'utente invia la password al server solo durante la creazione del proprio account e l'accesso. Per l'autenticazione della richiesta viene utilizzato JWT (contenente solo l'ID utente, con un segreto strong e una bassa scadenza) generato dopo ogni accesso.

Ho pensato di archiviare la password come testo normale nel database ma questo mi porta allo stesso problema, se il db viene compromesso, un utente malintenzionato potrebbe facilmente decifrare il contenuto dell'utente.

C'è un modo per farlo?

    
posta alex 13.11.2017 - 15:32
fonte

2 risposte

2

Un'opzione consiste nel generare la chiave utente dalla propria password all'accesso (o archiviare chiavi generate in modo casuale crittografate con essa). Questo viene quindi archiviato in memoria mentre sono loggati e cancellati dalla memoria alla scadenza del logout / sessione.

Ci sono ancora problemi qui -

  • Come imponi di pulire la chiave alla scadenza della sessione? - Un'azione che si verifica qui non è un normale flusso di lavoro del server.
  • È necessario prendere provvedimenti per impedire che i tasti vengano scaricati sul disco.

Un'altra opzione è crittografare / decodificare sul lato client usando qualcosa come l'API WebCrypto.

    
risposta data 13.11.2017 - 15:45
fonte
2

Se si desidera utilizzare la password dell'utente per sbloccare la chiave di crittografia, la soluzione migliore è utilizzare una chiave derivata da password per decodificare una chiave di crittografia dei dati. In questo modo la chiave utilizzata per la crittografia effettiva di una grande quantità di dati è puramente casuale, ma la chiave stessa viene crittografata con la chiave derivata dalla password.

Devi quindi richiedere nuovamente una password per decrittografare i dati o archiviare la chiave dati decrittografata in una qualche forma di memoria temporanea (forse la sessione), in modo tale che sia disponibile solo quando l'utente ha effettuato il login e poi lo scarica quando l'utente si disconnette.

Potresti fornire una protezione aggiuntiva per il resto se hai un TPM sul server che può crittografarlo con una chiave del server in modo tale che un dump dei dati della sessione non rivelerà direttamente la chiave, ma sta andando oltre quello che stavi inizialmente descrivendo.

Ci sono anche molti altri modi in cui puoi provare a tenere la chiave al sicuro durante l'uso a seconda dell'hardware che hai a disposizione, ma alla fine è un po 'più ampio di quello che una risposta in formato Q / A può gestire.

    
risposta data 13.11.2017 - 16:25
fonte

Leggi altre domande sui tag