attr_encrypted和devise,用户密码加密用户数据

时间:2014-11-21 16:22:51

标签: ruby-on-rails activerecord devise attr-encrypted

我正在使用the attr_encrypted gem,我也在我的环境中安装了设备。

我有一个用户模型,这是由devise处理的,数据库列是: 的 encrypted_pa​​ssword

用户可以保存客户端,我希望使用用户密码加密客户端名称和年龄。

我的 client.rb 文件如下所示: 这里数据成功加密。

class Client < ActiveRecord::Base

  attr_accessor :name :age 
  attr_encrypted :name, :age, key: "test1234"

但我想用Users.password加密数据。 像这样:

class Client < ActiveRecord::Base

  attr_accessor :name :age 
  attr_encrypted :name, :age, key: current_user.encrypted_password

current_user是Devise帮助器方法,但由于这是来自会话,因此我无法在模型中访问它。 基本上我想用用户密码加密所有客户端的东西。 但如果我使用encrypted_pa​​ssword执行此操作,那么我已经获得了解密整个字段的密码。 我想为用户提供安全保障,但我不想知道或无法查看他们的数据。 因此,唯一的方法是使用预先设定的用户密码加密所有数据?

编辑:

user.encrypted_pa​​ssword已经过哈希处理,每当我访问数据库时 - 我可以使用它来解密所有数据吗?

所以我应该要求用户密码 - &gt;像设计一样哈希 - 将它与users.encrypted_pa​​ssword进行比较?

我在某处有逻辑错误吗?

你会如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

attr_encrypted提供了一种指定实例方法来提供密钥的方法。

class Client < ActiveRecord::Base
  attr_encrypted :name, :age, key: :client_key

  def client_key
    # just assuming relation between Client and User
    self.user.encrypted_password
  end
end

来源:https://github.com/attr-encrypted/attr_encrypted#symbols-representing-instance-methods-as-keys

答案 1 :(得分:0)

当您使用Devise时,它使用bcrypt算法来加密您的密码,这是一种加密方式

即这个过程不可逆,没有办法从散列回到密码。 所以你可以使用那个哈希来加密整个数据。

但我的建议是你使用bcrypt算法来加密你的数据而不是使用用户密码,为什么我建议bcrypt而不是使用你的密码哈希来加密你的数据

  • 每次用户时,您都会重新加密数据 更改密码如果你在任何情况下都没有这样做,你就不会这样做 能够回溯你的数据。
  • 开销将更多,即每次重新加密数据 密码更改
  • encrypted_pa​​ssword将与用户紧密耦合 数据。我觉得用户数据应该独立于密码 与访问有关,应该有一个不同的独立 加密与用户登录或用户无关的使用数据 密码

您还可以参考:https://github.com/codahale/bcrypt-ruby