在列attr_encrypted栏内查询



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

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

下面是示例。我有一个users表,它有一个加密的secret属性。因此,该表有encrypted_secretencrypted_secret_ivencrypted_secret_salt。如果用户提供了"abd123"的密钥,我如何查询表以查看有多少其他人也使用"abc123"作为他们的密钥?

您还可以

保存未加密密钥的额外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_hash中分辨纯文本secret,它也允许您判断用户何时共享相同的secret。或者 - 更糟糕的是 - MD5 哈希可能在 MD5 反向查找字典中可用。

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

相关内容

  • 没有找到相关文章

最新更新