我有一个 ruby on rails 应用程序,我正在使用 attr_encrypted
gem 来加密一些用户信息。它有一个盐和IV,所以它是2路加密的。gem 拦截动态find_by
以帮助查询,但这对我的情况来说还不够,因为我关心结果的数量。
有没有办法查询表以返回与给定secret
匹配的所有结果?
下面是示例。我有一个users
表,它有一个加密的secret
属性。因此,该表有encrypted_secret
、encrypted_secret_iv
和encrypted_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 反向查找字典中可用。
您必须谨慎地权衡此安全问题与能够对该列进行查询的好处。