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"作为他们的秘密?
您还可以保存额外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 反向查找字典中可用。
您必须仔细权衡此安全问题与能够查询该列的好处。
| 归档时间: |
|
| 查看次数: |
478 次 |
| 最近记录: |