5

Estoy usando attr_encrypted para cifrar algunos de los campos de mi modelo, y uso Tire con Elasticsearch para la búsqueda de texto completo. Utilizo solo un formulario de búsqueda simple. aquí es parte de mi modelo:¿Cómo puedo hacer búsqueda comodín en elementos cifrados en la base de datos

class Student < ActiveRecord::Base 

    include Tire::Model::Search 
    include Tire::Model::Callbacks 

    attr_accessible :name, :surname 
    attr_encrypted :name,    :key => 'f98gd9regre9gr9gre9gerh' 
    attr_encrypted :surname,   :key => 'f98gd9regre9gr9gre9gerh' 

    def self.search(params) 
    tire.search(load: true) do 
     query { string Student.encrypt_name(params[:search]) } if params[:search].present? 
    end 
    end 
end 

Así, por ejemplo, si tengo el nombre "John" en la base de datos, cuando la búsqueda de "John" la consulta es de abono (Student.encrypt_name (params [ : búsqueda])) antes de consultar la base de datos, y se devuelve el resultado. Elasticsearch permite la búsqueda comodín, por ejemplo, si busco "Joh *", debe devolver el resultado coincidente, pero la palabra clave encriptada "Joh" es diferente de "John" encriptada, y db no arroja ningún resultado. Cualquier solución sobre esto sería apreciada.

Saludos, Radoslav

+0

¿Encontró una solución para esto? Tengo el mismo problema –

Respuesta

2

respuesta corta - una búsqueda de texto completo y de cifrado del cliente son excluyentes entre sí en el estado actual de la tecnología de punta.

respuestas más largas:

  1. Se pueden almacenar, además, el texto plano del soundex del nombre y comparar por ella. Esto requiere compromiso tanto en la funcionalidad como en la seguridad. Verifica qué es y juzga por ti mismo.

  2. Almacenar todas las coincidencias parciales posibles (o al menos algún subconjunto sensible de estas) del nombre cifrado en una tabla separada y unir por identidad (posible con datos encriptados). No vayas por mí, pero puedes buscar "hashing de datos" e "índice inverso" en google si te sientes aventurero. Tenga en cuenta que esto también perjudica la seguridad.

  3. Hay results teórico, pero no he encontrado nada cerca de la implementación.

0

Otra opción si sus datos es relativamente pequeño es para almacenar en caché los datos en la memoria del servidor y realizar operaciones de expresiones regulares coincidentes en el conjunto de datos en caché. Esto podría tener sentido si:

  1. usted tiene ~ 1000 estudiantes por escuela
  2. su clave caché es tal que una escuela determinada sólo puede buscar dentro de sus estudiantes
  3. guardar en caché el conjunto mínimo de campos que necesita para buscando sin serializar todo el objeto

Por supuesto, podría ser posible que un pirata informático acceda a la memoria de su servidor web y lea los datos. Esto podría ser parcialmente mitigado por una política de limpieza de caché bien diseñada.

Cuestiones relacionadas