password_hash/password_salt 对比 password_digest

password_hash/password_salt vs password_digest

我目前正在阅读 Michael Hartl 的书(Ruby 关于 Rails 教程第 3 版),他使用 password_digest 和他的身份验证模型,我查看了 Pragmatic Studio 的 Rails 课程和他们的示例视频中,他们在他们的身份验证模型中使用 passowrd_hash/password_salt。从维基百科看来,salt 似乎是密码学中的标准用法,并且具有多种安全用途。我在 password_digest 上真正能找到的是它使用 rails 方法 has_secure_password.

一个比另一个更受欢迎,还是它们最终服务于不同的目的?

当使用 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

您提到的两个系统都可以使用,只是取决于您希望使用什么、您有哪些可用选项等。

手动构建加盐哈希(基于例如 SHA1)确实是很长一段时间存储密码的默认方式。然而,几年后,很明显需要有更好(即更安全)的方法来存储密码,以确保即使攻击者可以访问原始哈希值,他们也无法轻易地暴力破解它们.

因此,在较新的 Rails 版本中,密码默认使用 has_secure_password 使用 Bcrypt 算法保存,该算法比简单的加盐哈希更适合密码存储。请注意,Bcrypt 也在内部使用盐。你只是不必自己处理它。

Hartl 使用的方法,has_secure_passworduses 一种称为 Bcrypt 的算法对密码进行加盐和哈希处理,生成一个 password_digest 字符串,该字符串包含三个部分:

  1. 表示该字符串是 Bcrypt 散列的标志
  2. (未经哈希处理的)盐
  3. 哈希密码+salt的结果

我不熟悉 Pragmatic Studio 课程,但听起来他们将 salt 和 hash 存储在不同的属性中。