¿Cómo se puede buscar un campo encriptado?

3

Estoy usando attr_encrypted para almacenar muchos campos. El problema es que necesito poder buscar algunos de estos campos.

Toma User.name .

Mi base de datos actual tiene User.e_name y User.e_name_iv . Si bien esto parece ser razonablemente seguro, no puedo buscar en mi base de datos para 'Joe Bloggs'.

Hashing

Luego consideré agregar un tercer campo de hash ( User.e_name_hash ) que podría usarse para encontrar un campo basado en el término de búsqueda de hash. Por lo tanto, la búsqueda de 'Joe Bloggs' está en hash, en comparación con todas las demás entradas y se encuentra el registro requerido. Pero para hacer esto, tendría que tener un sal constante en todos los datos en ese campo en esa tabla (también inseguro).

Impasse

Al enterarme de que una sal constante es terriblemente insegura, me he quedado sin ideas sobre la mejor manera de hacer que los campos encriptados puedan buscarse. Mis opciones son:

  1. Deja estos campos en texto plano.
  2. Mantenga estos campos encriptados y agregue un campo de hash con algo así como una sal larga y constante con SHA512 (la sal sería constante en todos los registros de cada campo de la base de datos pero exclusiva de ese campo).
  3. Hacer que mi base de datos descifre cada registro cada vez que se necesita una búsqueda (se puede hacer ahora pero es ineficiente a medida que aumenta el volumen).

Tenga en cuenta que los campos que necesito buscar no son super alta sensibilidad , no son similares a registros médicos o información clasificada.

¿Cuáles son tus recomendaciones?

    
pregunta sscirrus 04.08.2017 - 13:02
fuente

5 respuestas

2

Editado : vea la nota importante al final, que se agregó después de que publiqué originalmente y luego volví a leer la pregunta.

Lo único que se me ocurre es construir una tabla indexada usando hashes. Sin embargo, esto indudablemente debilitará su seguridad, ya que estamos intercambiando un cifrado completo que (con suerte) no filtra ninguna información sobre el contenido de las tablas de hashes, que filtran información sobre el contenido de los datos de un usuario (sabiendo el número de términos indexados para una cuenta dada le da a un ataque un punto de apoyo para el análisis de frecuencia, entre otras cosas).

Nota: Estoy asumiendo lo siguiente: tienes un iv diferente para cada usuario.

Antes de cifrar una fila de la base de datos, puede leer las filas y convertirlas en una tabla que indexará esos elementos. A continuación, se procesarán las fichas con una sal generada desde el iv. Entonces, ahora, para un usuario determinado, "secretfoo" se guarda en el índice como c9a60f248c3a99e2b7004061d5c74e5f2240426f1f0f95eaf5843aa875e68542 .

Cuando realice una búsqueda, deberá recorrer todas las direcciones iv para generar todas las sales, luego realizar una búsqueda del token c9a60f248c3a99e2b7004061d5c74e5f2240426f1f0f95eaf5843aa875e68542 para encontrar el registro que contiene 'secretfoo'.

Esta sería una búsqueda más rápida, pero hay un intercambio de velocidad por seguridad aquí. Debido a que esencialmente se ha guardado un diccionario de hashes para una palabra dada, si la base de datos se eliminara, es posible (pero improbable) que la información indexada se pueda usar para reunir los datos originales. Como mínimo, se puede utilizar para ensamblar metadatos sobre los datos. Dicho esto, sería computacionalmente difícil.

Supongamos que tiene 100,000 usuarios con aproximadamente 100 filas por usuario para un tamaño de tabla total de 100,000,000 filas de datos.

Descifrar todos los 100,000,000 millones para realizar una búsqueda no indexada llevará montañas de tiempo.

Bajo el paradigma anterior, solo tienes que generar 100,000 hashes y buscar cada uno de esos una vez en el índice para encontrar los registros que deseas. Además, podemos hacer coincidir cadenas completas (el hash) y no tiene que realizar ninguna búsqueda de subcadenas.

Esto tiene la ventaja de computar 100,000 hashes y realizar 100,000 búsquedas en una tabla indexada BTREE que nos da buenos resultados.

Como señaló Mike Ounsworth, todavía tendrá que decidir qué es sensible y qué no lo es para poder realizar una búsqueda; sin embargo, tener todos los tokens de hash SHA256 es órdenes de magnitud mejor que texto sin formato.

EDITADO :

Después de hacer mi publicación, volví a leer tu pregunta y me di cuenta de que habías guardado el iv en la base de datos, lo que haría que el índice fuera vulnerable a la exfiltración.

La única forma de solucionarlo es almacenar el iv en una base de datos separada que no está expuesta a la web y que solo se puede acceder a través de una API. Esta es una configuración común en aplicaciones compatibles con PCI.

Al realizar una consulta, su aplicación orientada a la web tendría que solicitar al servidor seguro el iv desde el que generaría el hash y realizar la búsqueda.

Esta es una implementación más complicada, pero si el iv está en la base de datos que está orientada a la web y está exfiltrada, todo lo que tienen que hacer es recorrer los ivs para descifrar todo el índice.

    
respondido por el DrDamnit 04.08.2017 - 15:17
fuente
2

Ya sabes la respuesta: 3 si quieres seguridad.
Si esto se vuelve demasiado lento, necesitará una computadora mejor, o más de una. Tan sencillo como eso.

De todos modos, no piense que puede decidir qué tan sensibles son los datos, porque esto varía mucho para diferentes personas y situaciones . Historia real: una persona que pierde el 20% de los ingresos anuales porque se sabía que comía helado de vainilla. ¿No te puedes imaginar cómo puede pasar esto? Exactamente, es por eso que: No decidas por otras personas qué mantener en secreto y qué no. .

    
respondido por el user155462 04.08.2017 - 13:29
fuente
1

Echa un vistazo a CryptDB . Cifra toda la base de datos y ejecuta consultas sobre los datos cifrados sin descifrarlos en el lado de la base de datos. Necesita cambiar su aplicación un poco para trabajar con CryptDB, pero los autores afirman que estos son cambios menores. Es completamente independiente del lenguaje.

Aquí está el whitepaper que describe cómo funciona.

    
respondido por el Daniel Szpisjak 06.08.2017 - 20:30
fuente
0

Sí, eso parece un impasse, está bien. Si está buscando un criptográfico inteligente, no encontrará uno.

Una de las propiedades es que el cifrado se denomina indistinguibilidad del texto cifrado , que dice que, dado un texto cifrado y una cadena aleatoria, el atacante no debería poder saber cuál es cuál. Como corolario, si tiene tres textos cifrados, dos de los cuales provienen del mismo texto simple, el atacante no debería poder decir cuál. Este es el punto de usar sales únicas o IV únicos para cada registro.

La idea de ser capaz de buscar conflictos de texto cifrado en un nivel fundamental con indistinguibilidad de texto cifrado.

La implicación aquí es que no puedes cifrar tus claves de búsqueda y aún mantener cualquier tipo de rendimiento. Tendrá que decidir qué cosas son sensibles y aceptar que no se pueden buscar. Es posible que pueda diseñar alrededor de esto hasta cierto punto pegando identificadores aleatorios en todo y teniendo más tablas de búsqueda.

    
respondido por el Mike Ounsworth 04.08.2017 - 14:41
fuente
0

Si necesita mantener sus datos importantes (datos que se están consultando) en forma cifrada, luego descifre mientras realiza la búsqueda, esto ralentizaría su base de datos y también le impediría realizar una optimización de búsqueda avanzada porque básicamente Estaré haciendo exploraciones de la tabla completa cada vez. La otra opción es TDE.

  • TDE (cifrado de datos transparente), la mayoría de los proveedores de bases de datos lo admiten ahora. y básicamente está cifrado en los archivos de espacio de tabla, sus tablas están cifradas mientras están en reposo y sin cifrar mientras están activas. Esto le brinda una buena postura de seguridad si desea que sus copias de seguridad sean seguras y transportables. Este método se escala mucho, probablemente Apple lo esté usando.

espero que esto ayude. Si aclara estos requisitos, puedo volver y editar mi sugerencia.

  • ¿Su acceso a los datos, la aplicación que usó los datos es segura?
  • ¿Qué proveedor de base de datos tiene? Oracle, Mysql, MSSQL.
  • ¿Es usted el almacén de datos de Big Data?
  • ¿Está basado su documento de base de datos?
  • ¿Tiene control y acceso a su base de datos?
respondido por el Hugo R 07.08.2017 - 07:44
fuente

Lea otras preguntas en las etiquetas