Crittografia dei dati utente tramite password e password dimenticata

15

Sto pensando di fare un'applicazione web che memorizzi molte cose personali (informazioni, foto ...). E per dare agli utenti un senso di protezione, voglio crittografare i dati prima di memorizzarli nel database.

Quindi, nel database memorizzerò l'hash della password (da validare contro) e i dati utente (crittografati con la password come chiave -o chiave derivata da password -).

Come posso fornire un'opzione forget-my-password? Vedo che l'unico modo è quello di memorizzare la chiave in qualche posto, il che elimina il vantaggio di crittografare i dati in primo luogo.

    
posta Yousf 03.02.2013 - 11:01
fonte

3 risposte

14

Il modo standard per farlo è il seguente:

  1. Crea un hash di autenticazione utilizzando un algoritmo di derivazione della chiave salata come PBKDF2 o bcrypt.
  2. Genera una chiave surrogata casuale per la crittografia dei dati. Cripta tutti i dati con questa chiave.
  3. Genera una chiave "bloccata" dalla password utilizzando un diverso salt, ma utilizza ancora un KDF strong.
  4. Xo la chiave surrogata con il tasto di blocco e memorizza quel valore. Ciò rende la chiave master sconosciuta a meno che la password non sia sconosciuta.
  5. Al login, genera il codice di blocco e lo aggiorna con la chiave surrogata memorizzata, che ti fornisce la chiave surrogata reale.

Il vantaggio di questo sistema è che consente di modificare facilmente la password: basta usare la vecchia password per decifrare la chiave surrogata, quindi generare una nuova chiave di blocco dalla nuova password.

Quando si utilizza un meccanismo del genere, il modo solo di decifrare i dati è di avere la password, a meno che non si crei una seconda copia crittografata della chiave surrogata utilizzando un altro segreto.

Ecco come lo farei io:

  1. Chiedi all'utente di fornirti 3 risposte segrete. Converti le risposte in maiuscolo e concatenali. Esegui quel valore tramite un KDF per creare una chiave di blocco secondaria.
  2. Xo la chiave surrogata con la chiave di blocco secondaria e la memorizza come chiave di backup.
  3. Quando l'utente dimentica la sua password, chiedi loro le risposte segrete e genera la chiave di blocco secondaria, quindi la usa per calcolare la chiave surrogata.

L'opzione delle risposte segrete è la più semplice, ma è possibile farlo con qualsiasi valore segreto.

    
risposta data 03.02.2013 - 12:30
fonte
9

Ci sono due modi per uscire dal problema della "password dimenticata":

  1. Crittografa i dati non con la password una , ma con le due password. Per renderlo efficiente, utilizzare una chiave intermedia: un file di dati viene crittografato con una chiave di file casuale K e la chiave K viene crittografata due volte: una volta con la prima password e una volta con la seconda password. In realtà vuoi comunque una chiave intermedia, per supportare le modifiche della password senza dover ricodificare tutti i dati.

    In questo scenario, la seconda password sarà la "password di backup" che l'utente non dimenticherà. Questo tipo di miracolo (in che modo l'utente non dimenticherà una password che non usa mai, dal momento che è riuscito a dimenticare la password che usa regolarmente?) Può essere raggiunto in diversi modi: la password di backup potrebbe essere una lunga sequenza di caratteri che l'utente scrive giù su un pezzo di carta, conservato in una cassastrong (o nel suo portafoglio); la password di backup potrebbe consistere in risposte a "domande di sicurezza" (come suggerisce @Polynomial); ...

  2. Utilizza impegno chiave . Una copia della password dell'utente, o di una chiave intermedia K , potrebbe essere archiviata da una "Terza parte fidata", da sbloccare in caso di emergenza. Il TTP dovrebbe essere adeguatamente protetto e acconsentire a sbloccare i segreti affidati solo come parte di una cerimonia ufficiale, controllata e controllata dove il proprietario dei dati (l'utente che ha dimenticato la sua password) dimostra la sua identità attraverso un mezzo fisico (ad esempio entrando in persona che mostra e la sua patente di guida). Il passo di escrow può essere eseguito senza interagire con il TTP se viene utilizzata la crittografia asimmetrica : il TTP ha una coppia di chiavi RSA , la password dell'utente viene crittografata con la chiave pubblica e il TTP utilizza la chiave privata per sbloccare la password persa.

    L'applicabilità del key escrow dipende realmente dal contesto e, in definitiva, da quanto puoi spendere l'utente per sbloccare i suoi preziosi dati. In una situazione diversa, la tecnologia di crittografia delle unità BitLocker di Microsoft (inclusa nelle recenti / costose versioni di Windows) supporta l'impegno delle chiavi in modo che sysadmin può salvare i dati degli utenti che hanno dimenticato la loro password.

    Key escrow significa che il server (con l'aiuto del TTP) può teoricamente sbloccare i dati dell'utente senza il suo consenso o conoscenza. Questo è un bene, i dati dell'utente non sono realmente suoi e l'utente non è disponibile (ad esempio, in un'azienda, quando un utente viene colpito da un bus, il suo successore deve essere in grado di leggere i dati aziendali memorizzati e l'inquilino precedente non può più a dare la sua password). Viceversa, il sito Mega , molto pubblicizzato, rinuncia deliberatamente a tutti i tipi di recupero di password e password per accertare, in modo molto legale, che non hanno modo di accedere ai dati senza la collaborazione dell'utente.

risposta data 03.02.2013 - 15:20
fonte
1

Metti un modo un po 'meno descrittivo, ma più concettuale, in pratica vuoi fornire due diversi mezzi per ottenere la stessa chiave. Questa è l'idea di avere una chiave dati, tipicamente unica per un record, o forse per tutti i record di un utente, a seconda delle esigenze di sicurezza. Quindi si cripta quella chiave con una chiave derivata dalla propria password e una chiave derivata da qualche altra informazione. Potrebbe essere una cosa alternativa che sanno o potrebbe essere qualcosa che il tuo server conosce. Può essere una crittografia simmetrica o, per una maggiore sicurezza, le informazioni che il server sa possono utilizzare una chiave pubblica per una chiave privata che non è presente sul server.

Quindi se l'utente perde mai la password e non è quindi in grado di accedere alla chiave dati, la crittografia alternativa può essere decifrata per recuperare la chiave. In ordine di sicurezza, la memorizzazione simmetrica della chiave sul server è meno sicura come se il server e il DB fossero compromessi, la crittografia è resa inutilizzabile. Le informazioni dell'utente potrebbero essere un po 'migliori, ma per essere facilmente memorizzabili, sarà probabilmente anche facilmente ricercabile o indovinabile, il che è insicuro anche se il server non è compromesso. L'opzione asimmetrica in cui il server non ha accesso alle informazioni necessarie per un ripristino (poiché sa solo come crittografare la versione di ripristino della chiave dati è la più sicura, ma è anche la più difficile dal punto di vista dell'usabilità come la decrittografia deve quindi essere effettuata a) a mano o b) da un server secondario altamente protetto, preferibilmente con la chiave privata in un TPM (modulo piattaforma affidabile) o un altro keystore hardware sicuro.

Comunque sia, il principio di base è lo stesso. Rendi la chiave sempre irrecuperabile senza il segreto, la archivi solo più volte con diversi segreti.

    
risposta data 04.02.2013 - 15:17
fonte

Leggi altre domande sui tag