Ruby BCrypt密码比较返回错误的评估

时间:2014-10-22 00:35:21

标签: ruby sinatra bcrypt bcrypt-ruby

为了安全地存储我的用户密码,我试图在我的Sinatra / Ruby应用程序中使用BCrypt。

以下代码属于我的用户模型。

require 'mongo_mapper'
require 'bcrypt'

# User model
class User
    include MongoMapper::Document
    include BCrypt

    key     :email,         String,         length: 6..50,      unique: true
    key     :password,      String
    key     :password_hash, String

    def password
        @password ||= Password.new(password_hash)
    end

    def password=(new_password)
        @password = Password.create(new_password)
        self.password_hash = @password
    end

    def self.authenticate(requested_email, requested_password)
        u = self.find_by_email(requested_email)
        u if u && u.password_hash == requested_password
    end
end

# Test user account
if User.count == 0
    user = User.new(email: "bar@foo.com")
    user.password = "admin"
    user.save
end

当我像这样调用authenticate方法时:User.authenticate("bar@foo.com", "admin"),代码返回false。我确信用户存在。

修改 u.password == requested_password也返回false

为什么会发生这种情况,即使传递给方法的值有效且正确?

1 个答案:

答案 0 :(得分:0)

创建一个名为secret的密钥,删除密码和password_hash。

将您的代码更改为:

def password=(password)
  self.secret = BCrypt::Password.create(password)
end

def password
  return BCrypt::Password.new(secret) if self.secret
  nil
end