如何对数据库中的加密元素进行通配符搜索

use*_*897 5 ruby-on-rails elasticsearch ruby-on-rails-3.2 attr-encrypted

我使用attr_encrypted加密我的一些模型字段,并使用Tire和Elasticsearch进行全文搜索.我只使用一个简单的搜索表单.这是我的模型的一部分:

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
Run Code Online (Sandbox Code Playgroud)

因此,例如,如果我在数据库中有名称"John",当我搜索"John"时,查询被加密(Student.encrypt_name(params [:search])),然后查询数据库,结果返回.Elasticsearch允许通配符搜索,例如,如果我搜索"Joh*",则应返回匹配结果,但加密关键字"Joh"与加密"John"不同,db不返回任何结果.任何解决方案都将受到赞赏.

此致,拉多斯拉夫

Pet*_*hev 2

简短的回答 - 全文搜索和客户端加密在当前最先进的技术中是相互排斥的。

较长的答案:

  1. 您还可以存储名称的发音的明文并进行比较。这需要在功能和安全性方面做出妥协。检查一下是什么并自行判断。

  2. 将加密名称的所有可能的部分匹配(或至少其中一些合理的子集)存储在单独的表中,并按身份进行匹配(可能使用加密数据)。对我来说不可行,但如果你喜欢冒险,你可以在谷歌上搜索“数据哈希”和“反向索引”。请注意,这也会损害安全性。

  3. 有理论结果,但我还没有发现任何接近实施的结果。