加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何有效地搜索加密字段?

发布时间:2020-12-17 02:06:52 所属栏目:百科 来源:网络整理
导读:我正在使用 Ruby on Rails 4.1,Ransack和attr_encrypted.我有敏感数据存储在我的数据库中,我想使用gem attr_encrypted保护它. 正如我所料,在使用Ransack搜索加密的测试数据时,我得到的结果为零. 我尝试了以下解决方案,但它似乎对我不起作用.我的印象是load函
我正在使用 Ruby on Rails 4.1,Ransack和attr_encrypted.我有敏感数据存储在我的数据库中,我想使用gem attr_encrypted保护它.

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

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

ReportsController

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

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

解决方法

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]) }

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读