0

コード:bcryptの::エラー:: Railsの中InvalidHashエラー

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) 

上記のコード製品「bcryptの::エラー:: InvalidHash "エラー。私の要件は、クライアントからユーザー名とパスワードを取得し、 のデータをdbに格納して検証することです。データベースでは、bcryptで暗号化されたユーザーのハッシュされたパスワードを保存しました。だから、今私は クライアントに入力されたパスワードを暗号化しようとしました。現在のパスワードを暗号化した後、dbに格納されているハッシュパスワードと一致します。しかし、それはエラーを生成します。この問題を解決するには?

答えて

1

BCrypt::Password.newに、ユーザーが送信しているパスワードではなく、データベースに保存したハッシュを指定する必要があります。次に、それをユーザーから受け取った入力と比較します。

例:あなたがRailsの> = 3を使用している場合、私はあなたのUserモデルとActiveModel::SecurePasswordを使用してに見てね、またhttps://github.com/codahale/bcrypt-ruby#how-to-use-bcrypt-ruby-in-general

# 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 

あなたはここにいくつかのより多くの情報を見つけることができます。その他の情報:http://api.rubyonrails.org/classes/ActiveModel/SecurePassword/ClassMethods.html

+0

パスワードの検証方法を説明できますか?なぜなら、dbはパスワードをハッシュしており、プレーンなパスワードを持っているからです。ハッシュされたパスワードを "BCrypt :: Password.new(user.password)"に渡すだけです。私は、提出されたパスワードのハッシュを取得し、そのハッシュを使用する必要があることを期待して、dbに格納されているパスワードを確認してユーザーのログイン認証情報を検証できます。しかし、ここではいくつか異なる。 – mrg

+0

'' BCrypt :: Password.new(user.password) 'は' == 'のパブリックメソッドを持っていますので、' db_hash == "plain_text" 'を呼び出すと、それはあなたが渡すプレーンテキストを暗号化します次に、ハッシュが同じかどうか比較してください。 ここでは、 'BCrypt'の' == 'のソースを見ることができます:http://bcrypt-ruby.rubyforge.org/classes/BCrypt/Password.html#M000009 私はそのことを説明したいと思います。ない。 – Kieran

+0

ここで、 "=="は、文字列比較で使用する演算子と同じではありません。そうですか? – mrg

関連する問題