Sql 在rails中查询attr_加密列
我有一个RubyonRails应用程序,我正在使用Sql 在rails中查询attr_加密列,sql,ruby-on-rails,ruby,encryption,attr-encrypted,Sql,Ruby On Rails,Ruby,Encryption,Attr Encrypted,我有一个RubyonRails应用程序,我正在使用attr\u encryptedgem加密一些用户信息。它有一个盐和IV,所以它是双向加密的。gem拦截dynamicfind_by以协助查询,但这对于我的案例来说还不够,因为我关心结果的数量 是否有方法查询该表以返回与给定的密码匹配的所有结果 这是一个例子。我有一个users表,它有一个加密的secret属性。因此,该表具有encrypted\u secret、encrypted\u secret\u iv和encrypted\u secret
attr\u encrypted
gem加密一些用户信息。它有一个盐和IV,所以它是双向加密的。gem拦截dynamicfind_by
以协助查询,但这对于我的案例来说还不够,因为我关心结果的数量
是否有方法查询该表以返回与给定的密码匹配的所有结果
这是一个例子。我有一个users
表,它有一个加密的secret
属性。因此,该表具有encrypted\u secret
、encrypted\u secret\u iv
和encrypted\u secret\u salt
。如果用户给出了一个“abd123”的秘密,我如何查询该表以查看有多少其他人也使用“abc123”作为他们的秘密?您还可以保存未加密秘密的额外secret\u哈希值。如果两个记录具有相同的secret
,则它们也将具有相同的secret\u散列
将类似以下内容添加到模型中:
scope :by_secret, ->(secret) {
where(secret_hash: Digest::MD5.hexdigest(secret)
}
before_save :generate_secret_hash
private
def generate_secret_hash
self.secret_hash = Digest::MD5.hexdigest(secret)
end
之后,您可以这样查询:
YourModel.by_secret('abd123').count
警告
存储MD5密码散列和其他敏感信息是一种安全风险。即使您无法从秘密散列中分辨出纯文本秘密
,它也允许您分辨用户何时共享相同的秘密
。或者更糟糕的是,MD5哈希可能在MD5反向查找字典中可用
您必须小心地权衡这个安全问题与能够查询该列的好处。谢谢。你知道这是否是在加密列上实现查询的唯一方法吗?因为每个列都应该有不同的salt
和iv
,IMO唯一的其他方法是加载所有列并根据搜索字符串检查每个解密的机密。