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

标签 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没有返回结果。对此的任何解决方案将不胜感激。

问候, 拉多斯拉夫

最佳答案

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

更长的答案:

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

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

  3. 有理论results但我还没有发现任何接近实现的东西。

关于ruby-on-rails - 如何对数据库中的加密元素进行通配符搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12474788/

相关文章:

ruby-on-rails - 自引用类的递归删除

ruby-on-rails - 如何在 Heroku 上重启 Rails 服务器?

javascript - Rail 3.2 与 JavaScript

ruby-on-rails - 按模型的 belongs_to 关系查询和排序

sql - 检查ES和SQL数据库之间的区别

ruby-on-rails - Ruby/Rails : Prepend, 将代码附加到所有方法

javascript - 如何在 Javascript 中获取给定 url 的内容类型?

c# - 反序列化对象中的Elasticsearch响应

elasticsearch - 如果我可以直接发布到Elasticsearch,为什么要使用Beats?

ruby-on-rails - 如何将长日期转换为日期?