我目前正在阅读Michael Hartl的书(Ruby on Rails教程第3版),他使用password_digest
和他的身份验证模型,我查看了Pragmatic Studio的Rails课程在他们的示例视频中,他们在身份验证模型中使用passowrd_hash/password_salt
。从wikipediaing来看,盐似乎是密码学的标准用途,并且具有多种安全用途。我在password_digest上找到的所有内容都适用于rails方法has_secure_password
。
是一个优先于另一个还是最终用于不同的目的?
答案 0 :(得分:2)
使用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
您提到的两个系统都可以使用,它只是取决于您希望使用的内容,您可以使用的选项等。
答案 1 :(得分:1)
手动构建salted哈希(基于例如SHA1)确实是很长时间以来存储密码的默认方式。但是,几年后,很明显需要有更好的(即更安全的)方法来存储密码,以确保即使攻击者可以访问原始哈希,也无法轻易地强制攻击
因此,在较新的Rails版本中,密码默认使用has_secure_password
使用Bcrypt算法保存,该算法比简单的盐渍哈希更适合密码存储。请注意,Bcrypt也在内部使用salt。你不必自己处理它。
答案 2 :(得分:1)
方法Hartl使用has_secure_password
,uses一种名为Bcrypt的算法对密码进行加密和散列,生成一个包含三个组件的password_digest
字符串:
我不熟悉Pragmatic Studio课程,但听起来他们将盐和哈希存储在不同的属性中。