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

Ruby and Sinatra, unable to compare hashed password with BCrypt

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

我已经成功地实现了用户注册时的散列密码方法,但是我无法让身份验证路由工作,它只是不匹配提供的密码和存储在数据库 (MySQL).

在阅读了很多文档、很多关于 Whosebug 的问题以及更多文档之后,我在这里寻求您的帮助。

我创建了一个简单的 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 似乎没有根据散列密码验证原始密码。

提前致谢,如有任何帮助,我们将不胜感激。

您对 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