![](/img/trans.png)
[英]Querying if an int is inside of an array column, Postgres with Rails
[英]Querying in rails on attr_encrypted column
我在rails应用程序上有一个ruby,我使用attr_encrypted
gem来加密一些用户信息。 它有盐和IV,所以它是双向加密的。 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哈希。
您必须仔细权衡此安全问题,以便能够查询该列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.