Memorizza gli stessi dati più volte con chiavi di crittografia diverse un problema di sicurezza?

5

Sto cercando di creare un sistema in cui molti dati sono crittografati all'interno del database. Il metodo di crittografia sarà un algoritmo valido attualmente accettato.

Per accedere a questi dati, un utente dovrebbe effettuare il login e quindi i dati dovranno essere decrittografati con qualche chiave. Ci saranno molti utenti che dovrebbero tutti avere accesso agli stessi dati.

Non voglio memorizzare questa chiave "master" nel codice sorgente (PHP), su disco o in qualsiasi altra parte in testo semplice.

Quindi, pensavo di poter crittografare la chiave di decodifica "master" con la password di ciascun utente e archiviarla accanto al loro record utente. Al momento dell'accesso, ricevono la chiave master decrittografata, che è quindi disponibile in memoria per consentire loro di decrittografare i dati dell'applicazione.

La mia preoccupazione iniziale è che se c'è una violazione dei dati del codice sorgente e dei dati, un utente malintenzionato potrebbe vedere che la stessa chiave è stata crittografata molte volte (una volta per ogni utente). Potrebbe quindi ridurre la sicurezza della chiave "master"? O per modelli nei dati crittografati o testando che un tentativo di decrittografia su un record corrisponde a quello di un altro?

Oppure sto semplicemente abbaiando dall'albero sbagliato e c'è già un metodo migliore là fuori?

    
posta Chris Rutledge 05.01.2018 - 10:25
fonte

2 risposte

4

Stai descrivendo alcuni problemi diversi.

Archiviazione di credenziali e altri segreti

I don't want to store this 'master' key in the source code (PHP), on disk, or anywhere else in plain text.

Hai ragione nel dire che i segreti hardcoding sono una cattiva idea, potresti provare a usare qualcosa come hashicorpo-vault ( Questo particolare articolo può essere correlato al tuo flusso di lavoro) o un servizio di gestione delle chiavi come Amazon KMS .

Accesso crittografato per più utenti

Ci sono alcune strategie diverse per questo tipo di installazione. È possibile crittografare i dati con una chiave condivisa e quindi crittografare quella chiave per ciascun utente utilizzando la chiave pubblica dell'utente. Dovresti quindi aggiornare la chiave per file e ricodificare nuovamente con la chiave pubblica di ogni utente se ci sono stati cambiamenti nell'appartenenza al gruppo di accesso.

La derivazione di una chiave basata sulla password può essere complicata perché è necessario assicurarsi di aggiornare correttamente tutte le chiavi e ripetere la crittografia se la password dell'utente cambia.

Potresti dare un'occhiata al progetto Mylar del MIT , in quanto cerca di realizzare qualcosa di simile alla memorizzazione e all'accesso modello che hai descritto

Scenario di violazione

My initial concern is that if there is a data breach of source code and data, then an attacker would see that the same key was encrypted many times (once for each user). Could this then reduce the security of the 'master' key?

Se decifri sempre il lato server e l'utente malintenzionato ha accesso, può prendere la copia decrittografata dei dati.

Se stai creando chiavi private che utilizzano la password come seme , quindi si rischia di rischiare soprattutto se le password possono essere identificate rubandole o invertendo gli hash.

Più generalmente

Could this then reduce the security of the 'master' key? Either by patterns in the encrypted data or by testing that a decryption attempt on one record matches that of another?

Credo che ti stia chiedendo se la crittografia dello stesso valore con più chiavi per utente diverse renderebbe più semplice tornare al valore in testo originale (?).

Se conosci il valore del testo in chiaro potresti essere in grado di capire gli altri valori di crittografia. Questo è noto come attacco " testo in chiaro noto ". Tuttavia, questo non significa che funzioni se ti capita di conoscere due diversi risultati di crittografia e sapere che l'input era lo stesso, ma non conosci l'input effettivo.

La tua domanda potrebbe anche essere che data la funzione di crittografia f(key, masterkey) e poi eseguirla una volta con key1 e poi con key2 confrontando i due risultati ti permette di calcolare masterkey o conoscere l'output di f(key1, masterkey) ti consente di calcolare key2 ?

Potrebbe essere possibile, ma dipenderebbe dagli algoritmi specifici, se c'è il padding, ecc. Se c'è un'entropia significativa negli algoritmi, lievi cambiamenti negli input dovrebbero dare output molto diversi che non mostrano pattern. Puoi anche leggere le " chiavi deboli " e Selected-plaintext attack .

    
risposta data 05.01.2018 - 18:28
fonte
2

Ciò che è importante osservare in un'ipotetica come questa è dove sono i tuoi punti deboli, e che breccia significherà.

Quindi, in questo caso, abbiamo una chiave di decrittazione master molto potente.

Ovviamente, stiamo memorizzando questo crittografato con qualcosa Sufficiently Strong (TM).

Ora arriviamo alla più antica debolezza crittografica dei mondi delle password degli utenti. Supponiamo di avere 1000000000 utenti. Tutti sono dottori di sicurezza / comp sci che hanno scritto dissertazioni sulla buona gestione delle password. Uno è Jim. Ora, Jim è il figlio del proprietario. Quando si parla di sicurezza, ha circa 3 watt. La sua password è passworddrowssap, e pensa di essere molto intelligente nel pensarlo.

Un giorno il tuo database verrà violato. Fuori sede esfiltrato, non di meno. Lanciano tutti i dati User_tbl in hashcat e vanno via per alcune ore. Tornano a una password violata: quella di Jim. Ora possono decifrare la chiave master usando la password di Jim. Ora hanno accesso completo a tutti i dati sensibili e crittografati nel database. Grazie, Jim.

La tua soluzione non è terribile e non riesco a pensare a una soluzione davvero valida, ma compensa tutta la sicurezza del database fino alla password più debole utilizzata dagli utenti.

    
risposta data 05.01.2018 - 16:41
fonte

Leggi altre domande sui tag