Abbiamo una richiesta per crittografare i dati personali dei clienti (e-mail, indirizzo, ecc.) Usiamo MySQL che non ha alcun TDE come MS SQL o Oracle. Quindi, insieme alla crittografia dei dati, è necessario preservare la funzionalità per interrogare direttamente questi dati (non LIKE). Quindi qualcosa di simile seleziona * da persona dove email='[email protected] '.
L'idea qui è di utilizzare l'hashing e assicurarsi che la crittografia non sia resa ridondante dalla scarsa funzione di hashing. Quindi, se usiamo bcrypt che ha un built-in salt casuale, dovrebbe andare bene. Il problema è che con salt random non possiamo costruire di nuovo lo stesso hash per poter eseguire query SQL. Se uso bcrypt ('[email protected] ') e restituirà un valore hash diverso non posso eseguire select * da person dove hash_email = bcrypt ('[email protected]'). Posso ottenere lo stesso valore di hash solo se utilizzo lo stesso sale (e fattore di lavoro). Ma avere sale a livello di applicazione non sembra essere un'ottima soluzione. Quindi cosa si può fare per questo?
Se avere un valore di sale per applicazione non è intelligente potrebbe essere un tipo di miglioramento se generiamo, diciamo, 1000 valori di sale casuali e li memorizziamo nel database? Se abbiamo bisogno di hash email, possiamo fare quanto segue:
- ottieni una veloce funzione di hashing numerico e calcola, ad esempio, m = num_hash (email) mod 1000
- vai alla tabella sale salta dove id = m
- email di hash con questo sale email_hash = bcrypt (sale, email) e archivia nel database
Per la ricerca possiamo applicare la stessa routine, ottenere email_hash ed eseguire query. Immagino che num_hash (email) mod 1000 non dica molto sull'e-mail stessa. Avere 1000 sali casuali è meglio che avere solo uno.
Qualsiasi suggerimento sarebbe benvenuto