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: