1

我正在使用attr_encrypted gem,并且还在我的环境中安装了设计。

我得到了一个由设计处理的用户模型,数据库列是: 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 已经被散列并且每当我访问数据库时 - 我可以使用它来解密所有数据吗?

所以我应该请求用户密码->像设计一样对其进行哈希处理-将其与 users.encrypted_pa​​ssword 进行比较?

我在某处有逻辑错误吗?

你会如何解决这个问题?

4

2 回答 2

0

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

即这个过程是不可逆的,没有办法从散列回到密码。因此您可以使用该哈希值来加密整个数据。

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

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

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

于 2014-11-29T12:26:05.293 回答
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

于 2014-11-21T17:18:41.577 回答