Rry

时间:2016-09-16 07:13:41

标签: ruby-on-rails ruby ruby-on-rails-4 model-view-controller bcrypt

代码:

class LoginController < ApplicationController
  def auth
        if params[:name].present? && params[:pass].present? && params[:role].present?
                @name=params[:name]
                pass=params[:pass]
                role=params[:role]

                epass = BCrypt::Password.new(pass)
        else
                render "argerror"
        end
  end
end

错误:

BCrypt::Errors::InvalidHash (invalid hash):
app/controllers/login_controller.rb:12:in `new'
app/controllers/login_controller.rb:12:in `auth'

密码加密机制:

salt = BCrypt::Engine.generate_salt
pass = BCrypt::Engine.hash_secret(pass, salt)

以上代码产品&#34; BCrypt :: Errors :: InvalidHash&#34;错误。我的要求是从客户端获取用户名和密码并进行验证 它与数据存储在db中。在数据库中,我存储了由bcrypt加密的用户的散列密码。所以,现在我试着 加密客户端输入的密码。加密当前密码后,它与存储在db中的散列密码相匹配。但它会产生错误。如何解决这个问题呢 ?

1 个答案:

答案 0 :(得分:2)

您需要提供BCrypt::Password.new存储在数据库中的哈希值,而不是用户提交的密码。然后将其与从用户收到的输入进行比较。

示例:

# Create hash of password
pass =  BCrypt::Password.create('TestPassword')
=> "$2a$10$3.D6D2htbiRrezmZUhePV.gaQlc3ZjFYD9hv43khN5eWP5y8BGUXG"

# Pass the hash you have stored to Password.new
db_hash = BCrypt::Password.new("$2a$10$3.D6D2htbiRrezmZUhePV.gaQlc3ZjFYD9hv43khN5eWP5y8BGUXG")

# Compare the input from the user to the password stored
db_hash == "TestPassword"
=> true

db_hash == "NotRealPassword"
=> false

您可以在此处找到更多信息:https://github.com/codahale/bcrypt-ruby#how-to-use-bcrypt-ruby-in-general

此外,如果您使用Rails&gt; = 3,我会考虑将ActiveModel::SecurePassword与您的用户模型一起使用。这里有更多信息:http://api.rubyonrails.org/classes/ActiveModel/SecurePassword/ClassMethods.html