Rails has_secure_password:它实际上是在数据库中散列密码吗?

时间:2014-04-21 20:29:35

标签: security bcrypt password-hash ruby-on-rails-4.1

使用has_secure_passwordUser模型的典型Rails 4.1应用在数据库中有一个password_digest列。当我创建新用户时,我仍然可以在控制台中访问纯文本密码:

# in rails console
> u = User.new(email: "test@test.com", password: "password")
> u.save
> u.password => "password"
> u.password_digest => "xjdk..."

但是,当我关闭控制台会话并启动一个新会话时,我无法再检索明文密码:

# close above console session and open a new one
> u = User.find_by(email: "test@test.com")
> u.password => nil

我假设明文密码只能在第一种情况下检索,因为它存储在内存中,当我调用u.password => "password"时,它从内存中检索值,而不是数据库

我一直认为has_secure_password将(salt +密码)存储为哈希,我认为这意味着理论上不可能(如果我可以使用该术语)来反转password_digest并获得原始密码。

我只是确保我将密码存储为真实哈希(即,无法检索原始密码)的假设是有效的。我已经阅读了Rails has_secure_password API,但它没有澄清我的问题。

1 个答案:

答案 0 :(得分:1)

你是对的 - 数据库只保存哈希密码,而不是密码本身。您可以使用read_attribute方法(http://www.rubydoc.info/docs/rails/3.0.0/ActiveRecord/AttributeMethods/Read)直接访问数据库来确认这一点:

> u = User.new …
> u.read_attribute(:password_digest)
=> # Some hash
> u.read_attribute(:password)
=> nil

顺便提一下,还要确保您的User模型password列。否则它将直接保存password,从而破坏了散列密码的目的。