attr_encrypted and devise, шифровать данные пользователя с помощью пароля пользователя

Я использую драгоценный камень attr_encrypted, и я также установил устройство в моей среде.

У меня есть пользовательская модель, это обрабатывается devise, а столбец базы данных: encrypted_password

Пользователи могут сохранять клиентов, и я хочу зашифровать имя и возраст клиентов с помощью пароля пользователя.

Мой файл 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_password, тогда я уже получу пароль для расшифровки всего поля. Я хочу обеспечить безопасность своих пользователей, и я не хочу знать или иметь возможность просматривать их данные. Таким образом, единственный способ сделать это - зашифровать все данные с помощью заранее созданного пароля пользователя устройства?

редактировать:

User.encrypted_password уже хэшируется, и всякий раз, когда я получаю доступ к БД, я могу использовать это для расшифровки всех данных, верно?

Поэтому я должен запросить пароль пользователя -> хэшировать его, как это делает devise - сравнить его с users.encrypted_password?

У меня где-то есть логическая ошибка?

Как бы вы решили это?

2 ответа

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

Так как вы используете Devise, он использует алгоритм bcrypt для шифрования вашего пароля, который является односторонним шифрованием

т. е. этот процесс необратим, нет способа перейти от хэша к паролю. так что вы можете использовать этот хеш для шифрования данных целиком.

Но я бы посоветовал вам использовать алгоритм bcrypt для шифрования ваших данных, а не пароль пользователя, поэтому я предлагаю вместо шифрования вашего пароля bcrypt, а не пароль.

  • Вам придется повторно шифровать ваши данные каждый раз, когда пользователь меняет свой пароль. Если вы не сделаете этого в любом случае, вы не сможете восстановить ваши данные обратно.
  • Накладные расходы будут больше, т.е. каждый раз при повторном шифровании данных при смене пароля
  • Encrypted_password будет очень тесно связан с пользовательскими данными. Я чувствую, что пользовательские данные должны быть независимыми от пароля, связанного с доступом, и должно быть другое независимое шифрование для данных использования, которые не связаны с логином или паролем пользователя.

Вы также можете ref: https://github.com/codahale/bcrypt-ruby

Другие вопросы по тегам