Recentemente ho parlato con un potenziale cliente che vuole creare un database che contenga dati abbastanza sensibili. Uno dei suoi requisiti chiave è che i dati archiviati verranno crittografati in modo tale che solo l'utente sarà in grado di accedervi. Anche se ci sono certamente alcuni svantaggi, ho pensato a come avrei potuto ottenere questo risultato e ho trovato il seguente approccio:
Quando viene creato un utente, sto creando per lui una coppia di chiavi pubblica / privata. La chiave privata verrà crittografata simmetricamente con la password dell'utente. Tutti i dati che sono memorizzati nel database (molto probabilmente tranne il timestamp - e ovviamente l'id) sono cifrati preventivamente con la chiave pubblica. Quando l'utente accede la password verrà utilizzata per decodificare la chiave privata, che a sua volta può essere utilizzata per decrittografare i dati dal database durante la lettura. Tutte le operazioni di decodifica e decodifica possono avvenire in modo trasparente nel livello di accesso ai dati.
Ci sono alcuni importanti svantaggi da affrontare qui:
- Dovremo rimuovere e crittografare la chiave privata quando l'utente desidera cambiare la sua password
- Se l'utente perde la sua password non saremo in grado di ricostruire i dati
- Sia la chiave privata che la password dell'utente devono essere temporaneamente salvate in testo
- Ogni volta che sospettiamo che una chiave privata sia stata danneggiata (nel senso di furto) dovremo ricodificare tutti i dati degli utenti
e, naturalmente, un po 'di più che non mi è ancora arrivato.
Il primo problema è scomodo per noi, ma può accadere in modo trasparente all'utente, quindi nessun grosso problema.
Il secondo è un po 'più complicato. Non vogliamo che l'utente perda i suoi dati, ma dovremo presumere che l'utente perderà la sua password (la memorizzazione e / o l'uso di una password fissa non sono opzioni per ovvi motivi - mai). Una possibile soluzione sarebbe quella di creare una passphrase molto strong (più di 30 caratteri) che verrà utilizzata per crittografare un backup della chiave privata. Questo potrebbe essere inviato all'utente tramite posta ordinaria o simili. L'utente può usare questo per ripristinare i suoi dati se ha dimenticato la sua password.
Ho una brutta sensazione di no. 3, ma al momento non ho un'idea migliore.
Il quarto problema è di nuovo scomodo per noi e potrebbe richiedere del tempo, ma non dovrebbe essere un grosso problema. L'unico problema è il fattore umano qui. Avremmo bisogno che l'utente effettui il login per eseguire la re-encryption e non sarebbe in grado di farlo automaticamente.
Esistono gravi difetti a questo proposito, in particolare per quanto riguarda la sicurezza dei dati? E 'comunque una buona idea?