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

时间:2012-09-18 10:06:52

标签: ruby-on-rails ruby-on-rails-3.2 elasticsearch 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

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

此致 拉多斯拉夫

2 个答案:

答案 0 :(得分:2)

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

更长的答案:

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

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

  3. 有理论results,但我没有找到任何接近实施的内容。

答案 1 :(得分:0)

如果数据相对较小,则另一个选项是将数据缓存在服务器内存中,并对缓存的数据集执行正则表达式匹配操作。如果出现这种情况可能有意义:

  1. 每个学校有大约1000名学生
  2. 您的缓存密钥是指某个学校只能在其学生中搜索
  3. 在不序列化整个对象的情况下缓存搜索所需的最小字段集
  4. 当然,黑客可能会访问您的网络服务器内存并读取数据。这可以通过精心设计的缓存刷新策略来部分缓解。