【问题标题】:attr_encrypted and devise, Encrypt user data with users passwordattr_encrypted and devise,用用户密码加密用户数据
【发布时间】:2014-11-21 16:22:51
【问题描述】:

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

我得到了一个由 devise 处理的用户模型,数据库列是: 加密密码

用户可以保存客户,我想用用户密码加密客户的姓名和年龄。

我的 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 进行比较?

我在某处有逻辑错误吗?

你会怎么解决这个问题?

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • 所以当我选择 user.encrypted_pa​​ssword 它是已经散列的值 - 但我确实可以访问它。当我检索到 encrypted_pa​​ssword 的用户表时,我可以解密他的所有客户端吗?
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 你的问题给了我一些见解,但对我来说仍然很抽象。所以你会建议跳过所有的加密,因为它根本不好?我的主要目标仍然是我想在无法读取的情况下加密数据。只有用户才能读取他/她的数据。
  • 我的意思是加密一点都不好,但事实是你只能在你可以访问服务器和数据库的情况下读取用户的数据,如果有人可以访问服务器和数据库我不认为仅仅加密你的数据库或用户表会有所帮助,因为如果用户访问它,应用程序将解密数据,因此任何有权访问服务器的人都可以轻松地解密它。保护您的用户数据的最佳方法是多级安全。但是如果你想加密所以你可以签出link
猜你喜欢
  • 2011-08-16
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 2015-03-14
  • 2017-05-18
  • 1970-01-01
相关资源
最近更新 更多