Archivia i dati utente crittografati nel database

10

Ho un'applicazione web con il seguente caso d'uso:

  • L'utente crea un account con nome utente e password - la password con hash viene archiviata nel database.
  • L'utente accede (persiste attraverso le sessioni) - il token di accesso è memorizzato nel cookie.
  • L'utente immette e invia dati di testo: i dati vengono archiviati nel database, ma sono sensibili e non dovrebbero essere esposti anche se il database è compromesso.
  • Solo l'utente (connesso) e nessun altro possono leggere i dati inviati.
  • Per comodità, non è necessario che l'utente inserisca una passphrase per crittografare / decrittografare i dati.

È fattibile? Come dovrebbero essere crittografati i dati?

    
posta Code 15.04.2017 - 01:56
fonte

2 risposte

8

È possibile utilizzare una funzione di derivazione della chiave per convertire la password dell'utente in una chiave di crittografia. Quindi si utilizzerà un generatore di numeri pseudocasuali crittograficamente sicuro per generare una chiave separata che crittograferebbe i dati dell'utente. Dovresti quindi utilizzare la chiave derivata per crittografare la chiave generata. Il testo cifrato risultante della chiave di crittografia dei dati potrebbe quindi essere salvato in modo sicuro nella tabella utente del database (chiamare il campo "encryptedkey" se lo si desidera). In questo modo, la password dell'utente diventerà il mezzo per decodificare la chiave crittografata dell'utente. La chiave che effettivamente crittografa i dati viene decodificata solo per un tempo sufficiente a decrittografare i dati crittografati. È necessario memorizzare quella chiave nella sessione per evitare la necessità di chiedere all'utente la sua password per ogni occorrenza di decrittografia.

In alternativa, è possibile memorizzare la chiave di crittografia della chiave in un servizio di gestione delle chiavi come quello offerto da Amazon AWS. In questo modo si recupera la chiave da Amazon su TLS usando solo un riferimento alla chiave. Ovviamente in questo caso sarà comunque necessario memorizzare le credenziali di autenticazione per il KMS da qualche parte nella propria architettura, possibilmente in un file di configurazione altamente sicuro recuperato da remoto.

  1. Generatore di numeri casuali ⟶ Aiuta a creare la chiave # 1.
    Questa chiave crittografa i tuoi dati. Rimane costante nel tempo. È necessario generare questa chiave quando l'utente si registra per la prima volta. Utilizzare un CSPRNG (generatore di numeri pseudo casuali crittograficamente sicuro) per garantire casualità e imprevedibilità sufficienti.

  2. Password ⟶ Convertita in chiave # 2 con PBKDF2.
    Questa chiave, la chiave # 2, viene utilizzata per crittografare la chiave 1. Dovrai insistere sulla chiave # 2 nella sessione dell'utente. Memorizza il modulo crittografato di Key # 1 nella tabella utente, in un campo chiamato (forse) "encryptedkey".

  3. Modifica delle password
    Ogni volta che l'utente cambia la propria password, è sufficiente eseguire nuovamente il punto 2, piuttosto che crittografare tutti i dati, tutto da capo. Basta convertire la nuova password in una chiave (Chiave n. 2), ricodificare la chiave n. 1 e sovrascrivere il vecchio valore per la forma crittografata della chiave n. 1.

  4. Crittografia / decrittografia dei dati
    Quando l'utente ha effettuato l'accesso, eseguire il passaggio 2. Una volta convertita la password in una chiave, decifrare la chiave n. 1. Ora che hai decrittografato la chiave # 1, puoi utilizzare la chiave 1 per crittografare e decrittografare i tuoi dati.

risposta data 15.04.2017 - 04:24
fonte
6

Non sono sicuro se questo può essere efficace come commento, invece di una risposta: felice di cambiare per il meglio.

L'unico scopo è fornire una rappresentazione visiva della risposta accettata di @ vrtjason , in quanto include un numero di scenari e comporta l'uso di un paio di chiavi (crittografia). Ecco qua:

Per completezza, le chiavi coinvolte in tale protocollo interpretano ruoli noti in letteratura come:

  • Chiave utente: DEK, chiave di crittografia dei dati
  • Password-Key: KEK, chiave di crittografia chiave

HTH

    
risposta data 21.03.2018 - 19:25
fonte

Leggi altre domande sui tag