Сравнение хэшей Ruby BCrypt

Я пытаюсь реализовать то, что кажется очень простым подходом к аутентификации, используя Sinatra и BCrypt, но явно что-то упускаю...

Пользователям предварительно назначается временный пароль, который хранится в открытом виде в БД.

Я аутентифицируюсь по временному паролю, а затем создаю хеш соли и пароля _и записываю их в виде строк в db (mongo в этом случае ).

Для аутентификации я получаю соль из базы данных и пароль пользователя для сравнения.

post "/password_reset" do
  user = User.first(:email => params[:email], :temp_password => params[:temp_password])
  if dealer != nil then
  password_salt = BCrypt::Engine.generate_salt
  password_hash = BCrypt::Engine.hash_secret(params[:password], password_salt)
  user.set(:password_hash => password_hash)
  user.set(:password_salt => password_salt)
  end
end

post "/auth" do
  @user = User.first(:email => params[:email])
  @user_hash = BCrypt::Password.new(@user.password_hash) #because the password_hash is  stored in the db as a string, I cast it as a BCrypt::Password for comparison
  if @user_hash == BCrypt::Engine.hash_secret(params[:password], @user.password_salt.to_s)   then
    auth = true
  else
    auth = false
  end
end

Значение, возвращаемое BCrypt ::Engine.hash _secret (params[ :password], password _salt )отличается от того, что хранится в базе данных (оба относятся к классу BCrypt ::Пароль, но они не совпадают ).

Что мне здесь не хватает? Заранее большое спасибо за любую информацию!

Марк

12
задан user1553220 19 August 2012 в 18:27
поделиться