在attr_encrypted列的rails中查询

use*_*380 5 ruby sql encryption ruby-on-rails attr-encrypted

我在rails应用程序上有一个ruby,我正在使用attr_encryptedgem来加密一些用户信息.它有盐和IV,所以它是双向加密的.宝石拦截动态find_by以协助查询,但这对我的情况来说不是一个充分的查询,因为我关心结果的数量.

有没有办法查询表以返回与给定匹配的所有结果secret

这是一个例子.我有一个users表,它有一个加密secret属性.因此encrypted_secret,这个表有encrypted_secret_iv,和encrypted_secret_salt.如果用户给出了"abd123"的秘密,我如何查询该表以查看有多少其他人也使用"abc123"作为他们的秘密?

spi*_*ann 2

您还可以保存额外secret_hash的未加密秘密。如果两条记录具有相同的内容secret,那么它们也将具有相同的内容secret_hash

将如下内容添加到您的模型中:

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
Run Code Online (Sandbox Code Playgroud)

之后,您可以这样查询:

YourModel.by_secret('abd123').count
Run Code Online (Sandbox Code Playgroud)

警告

存储密码和其他敏感信息的 MD5 哈希值存在安全风险。即使您无法区分纯文本secret和 a secret_hash,它也可以让您辨别用户何时共享相同内容secret。或者 - 更糟糕的是 - MD5 哈希可能在 MD5 反向查找字典中可用。

您必须仔细权衡此安全问题与能够查询该列的好处。