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
Так как вы используете Devise, он использует алгоритм bcrypt для шифрования вашего пароля, который является односторонним шифрованием
т. е. этот процесс необратим, нет способа перейти от хэша к паролю. так что вы можете использовать этот хеш для шифрования данных целиком.
Но я бы посоветовал вам использовать алгоритм bcrypt для шифрования ваших данных, а не пароль пользователя, поэтому я предлагаю вместо шифрования вашего пароля bcrypt, а не пароль.
- Вам придется повторно шифровать ваши данные каждый раз, когда пользователь меняет свой пароль. Если вы не сделаете этого в любом случае, вы не сможете восстановить ваши данные обратно.
- Накладные расходы будут больше, т.е. каждый раз при повторном шифровании данных при смене пароля
- Encrypted_password будет очень тесно связан с пользовательскими данными. Я чувствую, что пользовательские данные должны быть независимыми от пароля, связанного с доступом, и должно быть другое независимое шифрование для данных использования, которые не связаны с логином или паролем пользователя.
Вы также можете ref: https://github.com/codahale/bcrypt-ruby