password_hash/password_salt vs password_digest
В настоящее время я изучаю книгу Майкла Хартла (учебное пособие по Ruby on Rails, третье издание), и он использует password_digest
с его моделью аутентификации я проверил курс Rails от Pragmatic Studio и в своем примере видео они используют passowrd_hash/password_salt
в их модели аутентификации. Из википедии кажется, что соль является стандартным использованием в криптографии и имеет множество применений для обеспечения безопасности. Все, что я мог действительно найти на password_digest, это то, что он работает с методом rails has_secure_password
,
Один из них предпочтительнее другого или они в конечном итоге служат разным целям?
3 ответа
Создание соленого хэша вручную (на основе, например, SHA1) действительно долгое время было способом хранения паролей по умолчанию. Тем не менее, спустя пару лет стало ясно, что должны быть более совершенные (то есть более безопасные) способы хранения пароля, которые гарантировали бы, что даже если злоумышленник сможет получить доступ к необработанным хэшам, он не сможет легко их взломать.,
Таким образом, в более новых версиях Rails пароли по умолчанию сохраняются с has_secure_password
используя алгоритм Bcrypt, который гораздо более удобен для хранения паролей, чем простой соленый хеш. Обратите внимание, что Bcrypt также использует соль внутри. Вы просто не должны иметь дело с этим самостоятельно.
При использовании has_secure_password
большая часть магии шифрования выполняется автоматически для вас, и доступно несколько функций, которые облегчают вам проверку пароля пользователя.
Как взято из документации has_secure_password:
# Schema: User(name:string, password_digest:string)
class User < ActiveRecord::Base
has_secure_password
end
user = User.new(name: 'david', password: '', password_confirmation: 'nomatch')
user.save
# => false, password required
user.password = 'mUc3m00RsqyRe'
user.save
# => false, confirmation doesn't match
user.password_confirmation = 'mUc3m00RsqyRe'
user.save
# => true
user.authenticate('notright')
# => false
user.authenticate('mUc3m00RsqyRe')
# => user
User.find_by(name: 'david').try(:authenticate, 'notright')
# => false
User.find_by(name: 'david').try(:authenticate, 'mUc3m00RsqyRe')
# => user
Обе системы, которые вы упомянули, будут работать, все зависит от того, что вы хотите использовать, какие опции у вас есть и т.д.
Метод, который использует Хартл, has_secure_password
использует алгоритм Bcrypt для подсчета и хеширования пароля, создавая password_digest
строка, состоящая из трех компонентов:
- Флаг, который указывает, что строка является хешем Bcrypt
- (Неразбавленная) соль
- Результат хеширования пароля + соль
Я не знаком с курсом Pragmatic Studio, но, похоже, они хранят соль и хэш в разных атрибутах.