password_hash / password_salt vs password_digest

时间:2015-03-24 14:29:53

标签: ruby-on-rails ruby ruby-on-rails-4 salt digest

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

是一个优先于另一个还是最终用于不同的目的?

3 个答案:

答案 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_passworduses一种名为Bcrypt的算法对密码进行加密和散列,生成一个包含三个组件的password_digest字符串:

  1. 一个标志,指示该字符串是Bcrypt哈希
  2. (未撒布的)盐
  3. 散列密码+ salt
  4. 的结果

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