In generale, le soluzioni che fanno questo funzionano in modo simile al seguente. Dovresti trovare un sistema affidabile che già lo fa e usarlo, piuttosto che provare a crearne uno da solo.
- In primo luogo, genera una chiave simmetrica. Questa è la chiave principale e nessun utente potrà mai vederla direttamente. Non conservare questa chiave (in testo normale) ovunque possa essere raggiunta da un utente malintenzionato.
- Usa la chiave master per crittografare i dati e idealmente anche HMAC per integrità (o usa un altro modo per garantire l'integrità, come usare AES in modalità GCM).
- Esegui la password dell'utente tramite una funzione di derivazione chiave (come PBKDF2 o scrypt) utilizzando parametri diversi (ad esempio un sale diverso) rispetto a quello utilizzato per il verificatore della password. Non memorizzare queste chiavi derivate da password in qualsiasi luogo.
- Cripta la chiave master una volta con la chiave derivata da password di ciascun utente. Conserva queste copie crittografate della chiave master con i dati dell'account di ciascun utente pertinente.
Per accedere ai dati:
- Autentica l'utente. (Ciò significa in genere il recupero dei parametri del verificatore della password per il proprio account, l'esecuzione della password tramite la funzione di derivazione della chiave che utilizza tali parametri per produrre un verificatore della password e quindi verifica se tale verificatore corrisponde a quello archiviato per quell'utente.)
- Ottieni la chiave derivata dalla password per l'utente. (Recupera il secondo set di parametri KDF e passa la password nel tuo KDF usando quei parametri, sappiamo già che la password è corretta, quindi puoi aspettarti che la chiave derivata sia corretta senza verificarla.)
- Usando la chiave derivata da password, decrittografare la chiave master. Elimina la chiave derivata dalla password dalla memoria il prima possibile dopo averlo fatto.
- Utilizzando la chiave master decrittografata, verifica l'HMAC dei dati (o assicurane l'integrità), quindi decrittografali.
- Elimina la chiave master decrittografata dalla memoria e accedi ai dati (in tal caso dovrai ripetere i passaggi 2-4 se desideri modificare i dati e salvare le modifiche) oppure tenere premuto sulla chiave master decrittografata nella sicurezza della memoria che puoi organizzare.
- Elimina la chiave master decrittografata e i dati decrittografati dalla memoria il prima possibile.
Per cambiare la password di un utente:
- Se l'utente ha la sua vecchia password (rotazione della password), verifica la vecchia password e poi usala per generare l'attuale chiave derivata dalla password dell'utente e, con questo, decrittografare la chiave master. Usando la nuova password, generare la nuova chiave derivata dalla password dell'utente e ricodificare la chiave master con essa. Sostituisci la vecchia chiave master crittografata con quella nuova (nelle informazioni sull'account dell'utente).
- Se l'utente ha dimenticato la sua vecchia password, chiedi a un amministratore di verificare l'identità dell'utente con altri mezzi e chiedi all'utente di selezionare una nuova password. Quindi chiedere all'amministratore di ottenere la chiave master decrittografata inserendo la propria password, ricavando la propria chiave derivata da password e utilizzandola sulla propria copia della chiave master crittografata. Utilizzando la nuova password dell'utente, generare la nuova chiave derivata dalla password dell'utente e utilizzarla per crittografare la chiave master. Inserisci la chiave master crittografata con la nuova chiave nelle informazioni dell'account dell'utente, sostituendo quella che è stata crittografata utilizzando la chiave derivata dalla vecchia password (dimenticata).
Per gestire gli utenti:
- Per i nuovi utenti, in pratica segui semplicemente il flusso della "password dimenticata" sopra.
- Per eliminare un utente, o anche solo revocare il proprio accesso ai dati, eliminare la copia della chiave master crittografata utilizzando la chiave derivata da password dell'utente. Ciò rende impossibile per l'utente utilizzare la propria password per ottenere la chiave master con qualsiasi mezzo.
Nonostante i dettagli (che è presente solo per aiutarti a capire il sistema), PER FAVORE non tentare di implementarlo da solo. Ci sono numerosi dettagli critici aggiuntivi che sono mancanti o menzionati solo di passaggio. Ad esempio, è fondamentale che l'utente non veda mai direttamente la chiave master (altrimenti ne può memorizzare una copia, rimuovendo la possibilità di revocare in modo efficace il proprio accesso senza rigenerare l'intera struttura della chiave e ricodificare i dati). Molti di questi dettagli (come la memorizzazione sicura delle chiavi in memoria) dipenderanno dalla piattaforma.
Inoltre, ci sono molti modi per rovinare la crittografia stessa, anche se si utilizzano le implementazioni di libreria delle primitive crittografiche; se si generano le chiavi oi parametri di derivazione della chiave in modo errato e si scelgono le primitive errate o si implementa uno dei passaggi in un modo vulnerabile agli attacchi del canale laterale, l'intero schema potrebbe essere compromesso. Non cercare di capire questa roba da solo; andare con qualcosa che qualcuno già a conoscenza dell'implementazione della crittografia ha già messo insieme e che qualcun altro esperto ha esaminato.