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_password
,uses 一种称为 Bcrypt 的算法对密码进行加盐和哈希处理,生成一个 password_digest
字符串,该字符串包含三个部分:
- 表示该字符串是 Bcrypt 散列的标志
- (未经哈希处理的)盐
- 哈希密码+salt的结果
我不熟悉 Pragmatic Studio 课程,但听起来他们将 salt 和 hash 存储在不同的属性中。
我目前正在阅读 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_password
,uses 一种称为 Bcrypt 的算法对密码进行加盐和哈希处理,生成一个 password_digest
字符串,该字符串包含三个部分:
- 表示该字符串是 Bcrypt 散列的标志
- (未经哈希处理的)盐
- 哈希密码+salt的结果
我不熟悉 Pragmatic Studio 课程,但听起来他们将 salt 和 hash 存储在不同的属性中。