4

ユーザーを作成するとき(sinatraで)、これを行います

require 'Bcrypt'

post '/users' do
    @user = User.new(params[:user])
    @user.password_hash = BCrypt::Password.create(params[:password])
    p @user.password_hash == params[:password]              # this prints TRUE!
    @user.save!
    session[:user_id] = @user.id
    redirect '/'
end

次に、同じユーザーを確認しようとすると、これが表示されます

post '/sessions' do
  @user = User.find_by_email(params[:email])
  p @user.id                                                # prints 14
  p @user.password_hash                                     # prints correct hash
  p @user.password_hash.class                               # prints String
  p BCrypt::Password.new(@user.password_hash).class         # prints BCrypt::Password 
  p params[:password]                                       # prints "clown123"
  p BCrypt::Password.new(@user.password_hash) == params[:password] # prints FALSE!

    # redirect '/'
end

何が壊れた?BCrypt ドキュメント (データベースを使用しない) に示されている例は、毎回機能します。データベース (postgres) の何かが password_hash を変更している可能性はありますか?

最新バージョンの bcrypt と ruby​​ 1.9.3 を使用 (同じ結果で ruby​​ 2.0 以降も試しました)

4

1 に答える 1