He implementado el cifrado para ciertas columnas en una base de datos. En algunos casos, puede ser necesario buscar por estas columnas, ya sea para coincidencias exactas o para subcadenas. En este momento, hay menos de 10000 filas para buscar (como máximo). Sin embargo, esto probablemente cambiará en el futuro, por lo que estoy anticipando problemas de eficiencia.
Los datos permanecerán cifrados en la base de datos, pero cuando los recupere la aplicación, se podrán descifrar. Esto significa que la recuperación no tiene que ser 100% precisa, puede recuperar más registros que realmente coinciden con la consulta, y la aplicación en sí puede descartar los registros no coincidentes.
Con esto en mente, se me ocurrieron las siguientes soluciones:
-
Para una coincidencia exacta del texto, haga un hash de los datos cifrados y modúelo esto con un número relativamente bajo (2 ^ 16 quizás), y almacene ese valor en una columna adicional. Al consultar la base de datos, solo es necesario realizar la misma operación en la cadena de entrada y recuperar todos los registros con el valor hash correspondiente.
-
Para buscar subcadenas, haga clic en cada letra y modifique el resultado. A continuación, establezca el bit correspondiente en un número entero. Realice la misma operación en la cadena de consulta. Por lo tanto, solo es necesario recuperar registros en los que el resultado de un AND binario en la consulta con el valor almacenado sea mayor que 0. Esto también podría hacerse usando cada par de letras, quizás con un entero de 64 bits o más para permitir más registros para ser descartados.
Mi pregunta es, ¿alguna de estas técnicas tendría un impacto real en la seguridad de los datos en las columnas cifradas? El esquema de encriptación es AES-256.