代码:
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中的散列密码相匹配。但它会产生错误。如何解决这个问题呢 ?
答案 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