Me gustaría proteger la información confidencial almacenada en una base de datos Postgresql, pero no me gustaría cifrar todo. La idea es cifrar solo aquellos campos que contienen información confidencial. Estaba pensando en usar AES 256 para almacenar los datos, y he leído algunas publicaciones aquí con algunas ideas y recomendaciones sobre este tema.
El problema es que AES con CBC genera un texto cifrado diferente para el mismo texto simple (siempre que el IV sea diferente cada vez), por lo que pierdo la capacidad de buscar en esos campos. Uno de esos campos es el número de identificación de la persona, que se utiliza en nuestra aplicación web para buscar los datos de una persona. Lo que me gustaría implementar en nuestra aplicación es que cuando la solicitud proviene de un usuario para buscar a una persona con id '123', la aplicación cifra 123 y busca el valor cifrado (codificado en hexadecimal) en la base de datos. Tenga en cuenta que el campo ID no es una clave principal en la tabla.
Sin embargo, leí que proporcionar el mismo IV para AES no es una buena idea. ¿Hay algún conjunto de cifrado que pueda usar que produzca el mismo texto cifrado dado el mismo texto sin formato, y ofrezca un buen nivel de seguridad contra las grietas? ¿O está bien usar AES 256 CBC con el mismo IV para producir el mismo texto cifrado en este escenario?
Una de las publicaciones que leí sugirió agregar un nuevo campo a la tabla para almacenar el hash del texto sin formato para la búsqueda. Si bien esta es una buena idea, prefiero mantener mis tablas sin cambios porque queremos usar los mismos beans de persistencia para las bases de datos cifradas y no cifradas.
Lo que estoy tratando de evitar es que los DBA vean los datos de personas sensibles que realizan selecciones en tablas (la base de datos no está bajo nuestro control).
Cualquier consejo es muy apreciado!
Referencias: