Ruby和Sinatra,无法将散列密码与BCrypt进行比较

时间:2015-03-12 09:55:33

标签: mysql ruby hash ruby-datamapper bcrypt-ruby

我正在使用Sinatra和DataMapper开发一个简单的Ruby身份验证应用程序。

我已经成功实现了用户注册时的哈希密码方法,但我无法使身份验证路由正常工作,它只是将提供的密码与散列版本匹配,存储起来进入DB(MySQL)。

在阅读了大量文档后,有关stackoverflow的更多问题以及更多文档,我在这里寻求您的帮助。

我已经创建了一个简单的GET路由来尝试理解BCrypt库的工作原理,而不将密码存储到数据库中,此路由的目的只是为了理解如何使用该库:

get "/test" do
  password_hash = BCrypt::Password.create("wazz")
  password = "wazz"
  puts password_hash
  if BCrypt::Password.new(password_hash).is_password? password
    status 201
  end
  halt(500, {error: password_hash}.to_json)
end

所以基本上我所要做的就是向/ test发送一个GET请求,所有这些都应该完成,但事实并非如此,BCrypt :: Password.new似乎没有验证针对哈希的原始密码。

提前感谢您,非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您对bcrypt的使用有效,但程序流程错误。最重要的是,status 201的调用在此时不会从控制器退出,它会继续,所以你已经设置好了,以便bcrypt是否有效。

做这样的事情:

get "/test" do
  password_hash = BCrypt::Password.create("wazz")
  password = "wazz"

  unless BCrypt::Password.new(password_hash).is_password? password
    halt(500, {error: password_hash}.to_json)
  end

  status 201
  {message: 'Session created'}.to_json
end