5

我有一个 ruby​​ on rails 应用程序,我正在使用attr_encryptedgem 来加密一些用户信息。它有盐和 IV,所以它是 2 路加密的。gem 拦截动态find_by以帮助查询,但这对于我的情况来说还不够,因为我关心结果的数量。

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

这是示例。我有一张users桌子,它有一个加密的secret属性。因此,该表具有encrypted_secretencrypted_secret_ivencrypted_secret_salt。如果用户给出了“abd123”的秘密,我如何查询表以查看有多少其他人也使用“abc123”作为他们的秘密?

4

1 回答 1

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

之后,您可以像这样查询:

YourModel.by_secret('abd123').count

警告

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

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

于 2014-11-11T01:40:14.810 回答