Prenderò la risposta breve: non puoi fare ciò che vuoi. Non proprio.
Si desidera memorizzare una serie di valori facilmente ipotizzabili nel database, crittografati, quindi nessuno che interrompe il database può sapere cosa sono ... ma si desidera essere in grado di cercare nel database tale termine. Ciò significa che ogni "tag" sensibile deve crittografare allo stesso identico valore.
Ok, che ne dici di un esempio.
Name MedicalStatus
----------------------
Kevin Dying
Bob Alive
Charlie Dying
Diana Alive
Elaine Alive
.... followed by 10k more rows of 'Alive' or 'Dying'
... quanto più sicuro è avere:
Name MedicalStatus
----------------------
Kevin dk3jnnd832jj3fd
Bob cx32d89dh32gf1x
Charlie dk3jnnd832jj3fd
Diana cx32d89dh32gf1x
Elaine cx32d89dh32gf1x
... followed by 10k more rows of either 'dk3....' or 'cx32d...'
Non devi nemmeno "decifrare" i valori. Devi solo indovinare - hai detto che erano facilmente comprensibili, dopotutto - e hai incrinato ogni altra voce corrispondente nella tabella. Non importa quanto sei esagerato nel cercare di oscurare quei valori e quanto sia "sicuro" delle tecnologie che usi, sarà piuttosto ovvio dal punto di vista dell'attaccante che cosa sta succedendo.
(Diamine, se sono qualcosa come me, lo vedranno come un puzzle divertente, obbligatorio link ) o, se sono pigri, creeranno solo pochi record nel database usando il livello dell'app per vedere come vengono memorizzati i loro valori.
Quindi, quello disse ... cosa puoi fare?
Opzione A : elimina il requisito di query veloce. È possibile utilizzare il sale effettivo (non il pepe) e rendere le voci protette utilizzando un algoritmo di crittografia reversibile. Ma il rovescio della medaglia è, come hai capito, che le ricerche dovrebbero decifrare ogni voce durante una ricerca.
Opzione B : sicurezza per oscurità. Sì, sai che questa opzione sarà brutta (di solito la sicurezza dell'oscurità lo è). Ma potresti creare un campo e chiamarlo un hash - ma semplicemente XOR i suoi dati sulla colonna sensibile per rimescolarlo. Quando esegui ricerche, non cerchi più il campo stesso, ma la combinazione XOR. Significa che non puoi più fare ricerche di indice (dovresti accontentarti di scansioni di indici) e non è esattamente una configurazione strong ... ma è almeno meglio che avere tutte le stesse voci con gli stessi identici valori.
Opzione C : ha solo gli hash ricercabili per la persona che sta eseguendo la ricerca. Aka, hash le voci utilizzando una chiave che è unica per ogni persona. Certo, questo significa che non ci può essere alcuna ricerca globale ; ma consentirebbe almeno la possibilità per un utente di trovare i loro record corrispondenti.
Opzione D : ripensamento e riprogettazione. Seriamente, le tue esigenze non stanno davvero arrivando qui, e ho la sensazione che finirai per creare un sistema che non è affatto sicuro. Il tuo obiettivo qui non è "Crea un sistema che soddisfi i requisiti X e Y nel modo più sicuro possibile". Il tuo obiettivo è: "Realizza un sistema sicuro che cerchi di soddisfare i requisiti X e Y." Se non riesci a raggiungere gli obiettivi in modo sicuro, non dovresti farlo affatto.