복붙노트

[RUBY-ON-RAILS] "BCrypt :: 오류 :: InvalidHash"로그인 시도

RUBY-ON-RAILS

"BCrypt :: 오류 :: InvalidHash"로그인 시도

나는 프로젝트를 완료하는 것을 시도하고있다. 나는 사용자 모델로 일하고 있습니다. 언제 가입 모든 것이 좋아 보인다. 그러나 때 나는이 오류가 같은 멤버를 로그인 절차하려고합니다.

죄송하지만 뭔가 잘못 갔다. Heroku가 파일 프로그램 오류로 기록합니다

BCrypt::Errors::InvalidHash (invalid hash):
  app/controllers/sessions_controller.rb:8:in `create'

내 * sessions_controller *이 있습니다 :

class SessionsController < ApplicationController

  def new
  end

   def create
    user = User.find_by_email(params[:session][:email])
    if user && user.authenticate(params[:session][:password])
      sign_in user
      redirect_to user
    else
      flash.now[:error] = 'Invalid email/password combination'
      render 'new'
    end
  end


  def destroy
    sign_out
    redirect_to root_path
  end
end

및 사용자 모델은 다음과 같습니다

class User < ActiveRecord::Base
  attr_accessible :email, :name, :nickname,:password, :password_confirmation 
  has_secure_password


  before_save { |user| user.email = email.downcase }
  before_save { |user| user.nickname = nickname.downcase }
  before_save :create_remember_token
....validations......

    private

    def create_remember_token
      self.remember_token = SecureRandom.urlsafe_base64
    end
end 

이 내 session.helper입니다

module SessionsHelper

  def sign_in(user)
    cookies.permanent[:remember_token] = user.remember_token
    self.current_user = user
  end
  def signed_in?
    !current_user.nil?
  end

  def current_user=(user)
    @current_user = user
  end

  def current_user
    @current_user ||= User.find_by_remember_token(cookies[:remember_token])
  end

  def sign_out
    self.current_user = nil
    cookies.delete(:remember_token)
  end
end

.. Heroku가 다시 시작, 마이그레이션 변화가 없다 : 나는 Heroku가이 DB를 긁어했습니다.

해결법

  1. ==============================

    1.password_digest에 저장된 해시 (필드가 비어있는 경우 포함) 유효한 BCrypt 해시 아니라고이 의미합니다.

    password_digest에 저장된 해시 (필드가 비어있는 경우 포함) 유효한 BCrypt 해시 아니라고이 의미합니다.

    암호가 저장되지있어 결코 소화 있도록 단지의 has_secure_password이 아니 었 한 번에 사용자가 만든 같은 의견을 바탕으로, 그것은 보인다. 데이터베이스에서 봐, 당신은 아마 그 password_digest가 해당 사용자의 비어 볼 수 있습니다. 데이터베이스에서 사용자를 제거하고 새로운 작업 코드를 다시 작성하고 그것을 작동합니다.

    비록 의견과 논의하는 동안, 나는 암호가 잘못된 이유에 대한 (잘못된) 추측을했고, 난 이미 설명을 썼다. 그래서 여기 그것이 바로 여기에 적용되지 않는 경우에도이 문제를 가지고 미래의 방문자를위한 것입니다

    당신은 SHA1 또는 BCrypt 또 다른 알고리즘을 사용하여 전환하지만 다시 해시 BCrypt의 암호를 실패 할 때 일반적으로 발생합니다. 원래 암호에 액세스 할 수 없기 때문에 당신이 BCrypt 원래의 인증 방식을 모두 사용하기 때문에 (또는 당신이 ... 안 적어도)는 스위치에 조금 추한. 예를 들어, 당신이 전에 SHA1을 사용하여 현재 BCrypt를 사용한다면, 당신은 BCrypt 입력을위한 일반 텍스트 암호로 SHA1 암호 해시를 치료해야합니다. 예를 들어,이 같은 BCrypt 다이제스트를 생성 할 수 있습니다 :

    sha1_password = Digest::SHA1.hexdigest("#{salt}#{real_password}")
    self.password_digest = BCrypt::Password.create(sha1_password).to_s
    

    그런 다음, 당신은에 액세스 할 수있는 SHA1 암호 해시를 기반 bcrypt password_digests을 만들 수 있습니다.

    이 같은 인증 것이다 :

    sha1_password = Digest::SHA1.hexdigest("#{salt}#{attempted_password}")
    BCrypt::Password.new(self.password_digest) == sha1_password
    

    나는 위의 예에서 SHA1을 사용하지만, 이것은 다른 해싱 알고리즘을 위해 일뿐만 아니라 것입니다.

  2. ==============================

    2.이미 라이브 사용자가 있고, 마찬가지로 이미 데이터베이스에 암호화되지 않은 암호를 저장. 내가 bcrypt를 사용하기 시작 후에는 암호화 된 암호를 기다리고 있었다, 그리고 그것을 찾지 못한 경우,이 오류를 생산했다.

    이미 라이브 사용자가 있고, 마찬가지로 이미 데이터베이스에 암호화되지 않은 암호를 저장. 내가 bcrypt를 사용하기 시작 후에는 암호화 된 암호를 기다리고 있었다, 그리고 그것을 찾지 못한 경우,이 오류를 생산했다.

    따라서, 나는 자신의 암호를 재설정 오류를 잡아 레거시 메시지를 표시하기 위해이 구조를 추가 :

    begin
        # your code that attempts to login the user
    rescue BCrypt::Errors::InvalidHash
      flash[:error] = 'We recently adjusted the way our passwords are stored. Please click the "forgot username or password?" link to re-establish your password. Thank you for your understanding!'
      redirect_to password_resets_url
    end 
    

    도움이 되었기를 바랍니다.

  3. from https://stackoverflow.com/questions/11037864/bcrypterrorsinvalidhash-when-trying-to-sign-in by cc-by-sa and MIT license