Rails加密列仍然允许搜索

cod*_*oob 5 database encryption search ruby-on-rails

我有一个rails应用程序,需要我加密数据库中的一些列.

基于许多示例,我已经拥有加密的用户密码和电子邮件.即使像我这样的菜鸟,这似乎也很容易.

具体的挑战是我正在为律师开发一个应用程序(实际上是一个atty),我想加密他们客户的名字和地址,这样如果数据库被盗,那么这些数据是不可读的.问题是最终用户(律师)希望通过客户端进行搜索.

我假设基于我的要求,尽管存在争议(尽管可能缺乏知识),但数据库中的加密是正确的方法.我认为否则在应用程序中搜索将非常困难.似乎可以设置数据库,以便密钥可以在启动时从其他位置传递到数据库中,这样密钥就不在服务器上的某个文件中.

实际上,我甚至确信我正在寻找的那种加密是可行的还是实用的.我读了一下并搜索过,但到目前为止,我找不到明确的解决方案.以下是我看过的最有前途的事情.所有这些似乎都是强大而有创意 请帮助我纠正任何错误的印象,并指出,如果存在,可能会有效的解决方案.一如既往,谢谢.

attr_encrypted

应用程序加密,但我不认为实际搜索是可能的.

pgcrypto

使用postgresql的数据库加密,但它不是Rails 4.0,我似乎无法做到这一点.不确定它会做我想做的事情.

jmazzi/crypt_keeper

使用postgresql的数据库加密,但不允许搜索可行的客户端数据.

And*_*ane 2

您可以使用一种称为盲索引的技术来实现此目的。这种方法的优点是数据库永远不会看到密钥。

这是我创建的Ruby 实现。您可以在表达式上创建索引以进行模糊搜索。

class User < ApplicationRecord
  blind_index :initials, attribute: :name, expression: ->(v) { v.split(" ").map(&:first) }, ...
  blind_index :phone_last4, attribute: :phone, expression: ->(v) { v.last(4) } ...
end
Run Code Online (Sandbox Code Playgroud)

使用它时要非常有选择性,因为它会泄露某些行包含相同索引数据的事实。

这与执行查询并不 100% 相同LIKE。为查询建立索引的一种有效方法LIKEtrigrams。但是,如果您创建三元组并对其进行盲索引,攻击者就可以使用频率分析来破译数据。