如何有效地搜索加密字段?

时间:2014-07-19 21:39:11

标签: ruby-on-rails

我正在使用Ruby on Rails 4.1,Ransack和attr_encrypted。我有敏感数据存储在我的数据库中,我想使用gem attr_encrypted保护它。

正如我所料,在使用Ransack搜索加密的测试数据时,我得到的结果为零。

我尝试了以下解决方案,但它似乎对我不起作用。我的印象是加载函数用于返回解密值。

ReportsController

def index
  @report_list = Report.all.load
  @q = @report_list.search(params[:q])
  @reports = @q.result(distinct: true).order('created_at DESC')
end

有没有人有搜索加密数据的经验,可以帮助我生成有效的解决方案吗?

1 个答案:

答案 0 :(得分:1)

load将导致Active Record Collection执行查询并检索与您的查询匹配的结果(除了运行after_create回调,我相信这是你正在发生的解密之处)。

def index
  #returns all records in DB
  @report_list = Report.all.load


  #I'm surprised these aren't throwing undefined method search of Array (or something similar)
  @q = @report_list.search(params[:q])
  @reports = @q.result(distinct: true).order('created_at DESC')
end

我想在此之前,我通常手动做这件事并且不熟悉attr_encrypted或Ransack,但我相信这些概念足够通用它们可以应用于任何设置。那么,关于你的问题,有两种可能性。

如果您可以搜索确切的值:

Model.where(encrypted_field: encrypt(params[:value])).first

其中encrypt是一种加密并返回传递的字符串的方法。

其次(痛苦地)

Model.all.delete_if{|m| !m.encrypted_field.include?(params[:value]) }

这将逐字地拉取,解密和扫描数据库中的每个条目。

我强烈建议不要这样做,但你需要做你需要做的事。

如果您绝对需要加密信息,但仍需要能够进行此类搜索。我强烈建议在模型中添加某种标签。这将允许您删除敏感信息,但仍然可以搜索某些属性。