Cifrar campos de base de datos conservando la funcionalidad de búsqueda

3

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:

pregunta rober710 17.11.2015 - 23:23
fuente

2 respuestas

0

No puede usar el modo AES CBC porque requeriría que use el mismo IV para cada ID de usuario, o cifrar el ID varias veces con cada IV único en la base de datos y hacer una comparación. El primero anularía el propósito del modo CBC, y el segundo sería extremadamente lento.

Si realmente no tiene otra opción, use el modo AES-ECB, que siempre cifra el mismo texto sin formato con el mismo texto cifrado, dada la misma clave. Normalmente no se recomienda porque conserva patrones en sus datos, como se ve en esta respuesta . Si sus datos se ajustan a un tamaño de bloque único de 128 bits, esto no es una gran preocupación. Si la ID es simplemente un número entero, es casi seguro que se ajusta a un solo bloque. Si la ID es una cadena, puede caer en 2 o más bloques dependiendo de la longitud y la codificación (Unicode, por ejemplo). Más bloques conducirían a la posibilidad de un mayor análisis de lo que está dentro de los bloques en función de los patrones dentro de los datos (como la analogía de la imagen en el enlace). No estoy lo suficientemente calificado en criptografía para decirle los riesgos de esto.

Recomiendo encarecidamente que no se almacene el hash del texto sin formato de la ID en cualquier lugar, al menos si desea mantener esta ID segura. Una identificación que usted describe tiene una cantidad muy baja de entropía. Sería trivial hacer hash de miles de millones de ID hasta que coincidan con el hash, anulando por completo el propósito del cifrado.

Su escenario probablemente esté bien, si el modelo de amenaza solo protege de los DBA deshonestos. Simplemente recuerde que la aplicación DEBE obtener acceso a la clave de cifrado. Si la aplicación se ejecuta en la computadora del cliente, es probable que cualquier atacante cualificado pueda obtener acceso a ella.

    
respondido por el Steve Sether 19.11.2015 - 21:51
fuente
2

No recomendaría en realidad cifrar algo como un usuario id . Prácticamente no debería haber riesgo de que alguien lo vea, y realmente está haciendo mucho más trabajo de lo necesario. Un id de identificación de un usuario no es lo que imagino que mucha gente va a llamar "información confidencial".

En realidad, me cuesta mucho pensar en un caso de información confidencial en el que le gustaría usar una cláusula WHERE en SELECT . No me gustaría nunca buscar contra SSNs , por ejemplo.

Si desea comparar la entrada del usuario con algo como SSN , generalmente hay otra información como name y DOB que se ingresó junto con SSN . Extraería todos los registros en una matriz que coincida con esa información ( name , dob ) y luego verificaría cualquier entrada resultante con el SSN provisto y el SSN de la entrada, descifrado.

    
respondido por el d0nut 18.11.2015 - 00:23
fuente

Lea otras preguntas en las etiquetas