Tenemos una solicitud para cifrar los datos personales del cliente (correo electrónico, dirección, etc.) Utilizamos MySQL que no tiene ningún TDE como MS SQL u Oracle. Entonces, junto con el cifrado de datos, debemos preservar la funcionalidad para consultar estos datos directamente (no como LIKE). Entonces algo como seleccione * de la persona donde email='[email protected] '.
La idea aquí es utilizar el hash y asegurarse de que el cifrado no sea redundante por una función de hashing deficiente. Entonces, si usamos bcrypt que tiene incorporado sal aleatoria, debería estar bien. El problema es que con la sal aleatoria no podemos construir el mismo hash nuevamente para poder ejecutar consultas de SQL. Si uso bcrypt ('[email protected]') y devolverá un valor hash diferente, no podré ejecutar select * from person donde hash_email = bcrypt ('[email protected] '). Puedo obtener el mismo valor hash solo si uso la misma sal (y factor de trabajo). Pero tener sal para toda la aplicación no parece ser una gran solución. Entonces, ¿qué se puede hacer al respecto?
Si tener un valor de sal por aplicación no es inteligente, ¿podría ser un tipo de mejora si generamos, por ejemplo, 1000 valores de sal aleatorios y los almacenamos en la base de datos? Si necesitamos un hash de correo electrónico, podemos hacer lo siguiente:
- obtenga alguna función de hashing numérico rápido y calcule, digamos, m = num_hash (correo electrónico) mod 1000
- ir a la tabla de sal tomar sal donde id = m
- hash email con este salt email_hash = bcrypt (salt, correo electrónico) y almacene en la base de datos
Para realizar búsquedas podemos aplicar la misma rutina, obtener email_hash y ejecutar la consulta. Supongo que num_hash (correo electrónico) mod 1000 no dice mucho sobre el correo electrónico en sí. Tener 1000 sales aleatorias es mejor que tener una sola.
Cualquier sugerencia sería bienvenida