Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在rails中查询attr_加密列_Sql_Ruby On Rails_Ruby_Encryption_Attr Encrypted - Fatal编程技术网

Sql 在rails中查询attr_加密列

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

我有一个RubyonRails应用程序,我正在使用
attr\u encrypted
gem加密一些用户信息。它有一个盐和IV,所以它是双向加密的。gem拦截dynamic
find_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唯一的其他方法是加载所有列并根据搜索字符串检查每个解密的机密。