Cifra i campi DB preservando la funzionalità di ricerca

3

Vorrei proteggere le informazioni sensibili memorizzate su un database Postgresql, ma non vorrei cifrare tutto. L'idea è di criptare solo quei campi che contengono informazioni sensibili. Stavo pensando di utilizzare AES 256 per archiviare i dati, e ho letto alcuni post qui con alcuni approfondimenti e consigli su questo argomento.

Il problema è che AES con CBC genera un diverso testo cifrato per lo stesso testo in chiaro (a condizione che l'IV sia diverso ogni volta) quindi perdo la possibilità di cercare su quei campi. Uno di questi campi è il numero ID della persona, che viene utilizzato sulla nostra webapp per cercare i dati di una persona. Quello che mi piacerebbe implementare nella nostra app è che quando la richiesta arriva da un utente per cercare una persona con id '123', l'app crittografa 123 e cerca il valore crittografato (codifica esadecimale) nel database. Nota che il campo ID non è una chiave primaria nella tabella.

Tuttavia ho letto che fornire la stessa IV per AES non è una buona idea. C'è una suite di cifratura che posso usare che produce lo stesso testo cifrato dato lo stesso testo in chiaro e offre un buon livello di sicurezza contro il cracking? O è OK utilizzare CBC AES 256 con lo stesso IV per produrre lo stesso testo cifrato in questo scenario?

Uno dei post che ho letto suggeriva di aggiungere un nuovo campo alla tabella per memorizzare l'hash del testo in chiaro per la ricerca. Anche se questa è una buona idea, preferisco mantenere le mie tabelle senza modifiche perché vogliamo utilizzare gli stessi bean di persistenza per i database crittografati e non crittografati.

Quello che sto cercando di impedire è che gli amministratori di database vedano i dati personali sensibili eseguire selezioni sulle tabelle (il database non è sotto il nostro controllo).

Qualsiasi consiglio è molto apprezzato!

References:

posta rober710 17.11.2015 - 23:23
fonte

2 risposte

0

Non è possibile utilizzare la modalità CBC AES perché richiederebbe l'utilizzo della stessa soluzione per ciascun ID utente o criptare l'ID più volte con ogni IV univoco nel DB e fare un confronto. Il primo annullerebbe lo scopo della modalità CBC e il secondo sarebbe estremamente lento.

Se davvero non hai altra scelta, usa la modalità AES-ECB, che cripta sempre lo stesso testo in chiaro con lo stesso testo cifrato, data la stessa chiave. Normalmente non è raccomandato perché conserva i pattern nei tuoi dati, come mostrato in questa risposta . Se i tuoi dati si adattano a una singola dimensione di blocco di 128 bit, questa non è una grande preoccupazione. Se l'ID è semplicemente un numero intero, quasi certamente si adatta a un singolo blocco. Se l'ID è una stringa, potrebbe cadere in 2 o più blocchi a seconda della lunghezza e della codifica (unicode per esempio). Più blocchi porterebbero al potenziale di ulteriori analisi di ciò che è all'interno dei blocchi in base ai modelli all'interno dei dati (come l'analogia dell'immagine nel collegamento). Non sono abbastanza qualificato in cripto per dirti i rischi di questo.

Raccomanderei strongmente di non archiviare l'hash del testo in chiaro ID ovunque, almeno se si desidera mantenere questo ID sicuro. Un ID che descrivi ha una quantità molto bassa di entropia. Sarebbe banale imbustare un ID di miliardi finché non corrisponde all'hash, annullando completamente lo scopo della crittografia.

Il tuo scenario è probabilmente OK, se il modello di minaccia sta solo proteggendo da DBA canaglia. Basta ricordare che l'applicazione DEVE in qualche modo ottenere l'accesso alla chiave di crittografia. Se l'applicazione viene eseguita sul computer client, è probabile che qualsiasi utente malintenzionato esperto possa accedervi.

    
risposta data 19.11.2015 - 21:51
fonte
2

In realtà non consiglierei di crittografare qualcosa come un utente id . Non dovrebbe esserci praticamente alcun rischio per chiunque lo veda e stai davvero facendo molto più lavoro per te del necessario. Un id di identificazione di un utente non è ciò che immagino che molte persone chiameranno "informazioni sensibili".

In realtà sto vivendo un momento difficile cercando di pensare a un caso di informazioni sensibili che ti piacerebbe utilizzare una clausola WHERE su in SELECT . Ad esempio, non vorrei mai effettuare una ricerca con SSNs .

Se desideri confrontare l'input dell'utente con qualcosa di simile a SSN , generalmente ci sono altre informazioni come name e DOB che vengono immesse insieme a SSN . Vorrei estrarre tutti i record in un array con quella corrispondenza che informazioni ( name , dob ) e quindi controllare le voci risultanti con SSN fornito e SSN dalla voce, decifrato.

    
risposta data 18.11.2015 - 00:23
fonte

Leggi altre domande sui tag