【问题标题】:Ruby Rails query selection criteria includes encrypted fieldRuby Rails 查询选择条件包括加密字段
【发布时间】:2011-06-23 20:59:44
【问题描述】:

我正在使用 Rails 2.3.4

我不是在寻找这个问题的具体答案,而是更多地寻找关于这个问题的一般指导。

在我们的 (MySQL) 数据库中,我们对个人身份信息 (PII) 进行加密,例如姓名、地址、电话号码等。但我一直收到动态查询请求。

例如,“您能否查询数据库以获取给定日期的条目值,但仅适用于区号列表中的用户”。

因此,选择标准包括一些 PII 加密数据,例如他们的电话号码的区号。

对于本次讨论,User 和 Entry 表具有以下感兴趣的字段:

User.id,User.phone

Entry.user_id,Entry.value,Entry.created_at

由于加密,我无法连接 SQL 客户端并以“简单”的方式进行查询,以从区号列表 (555,222,333) 中的用户获取 2010 年 11 月 21 日的所有条目,类似这样:

SELECT E.value,SUBSTR(U.phone,2,3) FROM users U INNER JOIN 条目 E ON E.user_id = U.id 日期(E.sent_at)='2010-11-21' AND SUBSTR(U.phone,2,3) in ('555','222','333')

我想在控制台中做一个查询,可能会给我类似的数据。

似乎加密字段不能用作选择标准,所以我猜测它们在显示它们之前不会被解密(而不是查询它们)。

我的蛮力痛苦的方式是以下多步骤过程:

  1. 选择所有活跃用户的ID和区号。 User.all(:select => "id, phone",:conditions => ["state='active'"])
  2. 做一个终端的屏幕抓取,
  3. 复制到文本编辑器,按摩,
  4. 粘贴到excel中,
  5. 使用 excel“过滤器”仅获取所需区号的用户 ID,
  6. 将它们粘贴到一个平面文件中,按摩成一个逗号分隔的列表,然后
  7. 粘贴到我的 SQL 客户端以通过 user_id 查询 SELECT * FROM entries WHERE user_id IN () and date(created_at) = ''。

“一定有更好的方法!”有什么建议?提前致谢,

【问题讨论】:

    标签: ruby-on-rails console conditional-statements encryption


    【解决方案1】:

    如果您使用 ActiveRecord,请查看 attr_encrypted gem。它为你做了很多。

    以下设置加密属性:

    class User < ActiveRecord::Base
      attr_encrypted :phone, :key => 'a secret key'
      attr_encrypted :password, :key => 'some other secret key'
    end
    

    您可以像这样在加密值上查找和登录用户:

    User.find_by_email_and_password('test@example.com', 'testing')
    

    https://github.com/shuber/attr_encrypted

    【讨论】:

    • 嗨乔丹,感谢您的参考。我们不在代码中存储加密密钥。这将使任何有权访问数据库和代码的人都能解密。我们使用 PGP 凭据、公钥/私钥等。当我检索记录时,它似乎可以很好地处理解密。 (uu=User.find(23)) 将返回整个用户记录,解密。但是 uu=User.find_by_phone('6065551212') 不会通过电话号码找到用户。也就是说,在启用加密的生产服务器上,它不会通过电话号码找到它,但在未启用加密的开发服务器上,它会找到它。
    猜你喜欢
    • 1970-01-01
    • 2012-02-25
    • 2013-07-30
    • 1970-01-01
    • 2013-10-23
    • 2014-11-11
    • 2016-02-02
    • 1970-01-01
    • 2016-07-04
    相关资源
    最近更新 更多