2

我们正在加密表/模型中的值 - RegisteredDomain,使用下面的 attr_encrypted

attr_encrypted :domain_name, :registered_by, :api_key, :key => "65xU4TdZntTV53"

值也会被加密并存储到 db 中。下面的代码将值保存到 db。

registereddomain = RegisteredDomain.new(
        :domain_name => domain_name,
        :api_key =>  api_key,
        :hash_key => hash_key,
        :registered_by => ep_id,
        :status =>  status,
        :domain_type_id => domain_type_id              
        )
registereddomain.save

问题在于使用以下选择解密值。我们在这里得到加密值,谁能告诉如何在列表中获取解密值。

def select_all
  @registered_domains = RegisteredDomain.select("id, encrypted_domain_name, domain_type_id, encrypted_api_key, status").order(updated_at: :desc)
  return @registered_domains
end
4

2 回答 2

0

以加密模式将值存储在数据库中可能是有原因的。因此,如果要解密该值,只需在实例方法上调用适当的方法:

@registered_domains = RegisteredDomain.select("id, encrypted_domain_name, domain_type_id, encrypted_api_key, status").order(updated_at: :desc)
@registered_domains.first.domain_name

编辑

您可能想创建一个自定义方法来从数据库中提取值:

def self.all_decrypted(columns)
  all.map do |record|
    columns.map do |column|
      record.send(column.to_sym)
    end
  end
end

RegisteredDomain.all_decrypted([:domain_name, :api_key]) 这将返回一个数组数组,实际值为domain_name, api_key

于 2015-10-26T11:04:37.953 回答
0

如果您也可以为控制器和视图提供一些示例代码,那就太好了。我看到您直接使用没有attribute选项的字段;所以在您的数据库中,该字段domain_name必须表示为encrypted_domain_name. 因此,在您的选择查询中,您可以尝试将属性修改encrypted_domain_namedomain_name. 你也应该在任何你想得到加密属性的地方修改它。(我无法正确编写完整的代码块,因此我试图简短地解释它;但只需重命名属性就可以了!)

于 2015-12-04T09:01:52.990 回答