2017-12-05 19 views
0

나는 유사한 질문이 here라고 묻는 것을 안다. 그러나 어떤 대답도 내 문제를 해결하지 못하는 것 같다. 나는 Python3, Flask 및 flask-bcrypt를 사용하고 있습니다.flask-bcrypt 잘못된 소금; 인코딩 문제?

로그인 기능이 이전에 잘 작동하고 있었고 무엇이 변경 되었기 때문에 어떤 일이 일어 났는지 확실하지 않습니다.

password = form.password.data.encode('utf-8') 
hashed_password = bcrypt.generate_password_hash(password).decode('utf-8') 

을 그런 다음 로그인 할 때, 우리는 데이터베이스에 전달하기 전에 다음과 같이 내가이 가입, 우리가 UTF-8로 수신 된 비밀번호를 인코딩하기위한 것입니다 이해하는 방법은 다음 해시 된 암호를 해독

password = form.password.data.encode('utf-8') 
if bcrypt.check_password_hash(user.password, password): 

하지만 난이에서 오류 잘못된 소금을 얻을 : 우리는 후보 암호를 인코딩하고 다음과 같이 데이터베이스에 해시 된 암호가 비교로되어있다. 그리고 저는 성공한 몇 가지 다른 변종을 시도했습니다.

도움을 주시면 감사하겠습니다. 다음은보기입니다. 필요한 다른 코드를 제공 할 수 있습니다.

@app.route('/<role>/signup/', methods=['GET', 'POST']) 
def signUp(role): 
    form = RegisterForm() 

    if form.validate_on_submit(): 
     password = form.password.data.encode('utf-8') 
     hashed_password = bcrypt.generate_password_hash(password).decode('utf-8') 
     new_user = User(role=role, password=hashed_password, visits=1) 
     form.populate_obj(new_user) 

     db.session.add(new_user) 
     db.session.commit() 

     login_user(new_user) 

     return redirect(url_for('createContactInfo', user_id=current_user.id)) 

    return render_template('signup.html', form=form, role=role) 

@app.route('/login/', methods=['GET', 'POST']) 
def logIn(): 
    form = LoginForm() 

    if form.validate_on_submit(): 
     password = form.password.data.encode('utf-8') 
     user = User.query.filter_by(email=form.email.data).first() 
     if user: 
      if bcrypt.check_password_hash(user.password, password): 
       login_user(user, remember=form.remember.data) 
       User.query.filter_by(id=current_user.id).update({'visits': User.visits + 1}) 
       db.session.commit() 

       if current_user.role == 'admin': 
        return redirect(url_for('adminMainPage', user_id=current_user.id)) 
       elif current_user.role == 'guest': 
        return redirect(url_for('guestMainPage', user_id=current_user.id)) 
       else: 
        return "wrong role!" 

      flash('Invalid login') 
      return render_template('login.html', form=form) 

     flash('Invalid login') 
     return render_template('login.html', form=form) 

    return render_template('login.html', form=form) 

답변

0

그래서 나는 알아 냈습니다. 그리고 그 대답은 정말로 그 질문과 관련이 없습니다.

문제는, 가입, 난 password=hashed_password와 오브젝트 new_user 인스턴스화되었지만, 그때는 wtforms docs에 따른 상쇄 동작 인 form.populate_obj(new_user)라고하고 해싱되지 않은 결과 오버라이드 new_user.password = form.password.data 등.

그래서 DB에 unhashed 암호를 저장하고 로그인시 해시 된 암호와 해시 된 저장된 암호를 비교했습니다. 그러므로 잘못된 소금. 다른 관련 문제에서 논의 된 바와 같이, Invalid Salt 오류는 근본적인 문제를 실제로 지적하지 않는 거대한 함의입니다. 해결하려면

, 내가 먼저 form.populate_obj(new_user)라고 다음과 같이 다음 별도의 속성을 추가 :

new_user = User() 

    form.populate_obj(new_user) 

    new_user.role = role 
    new_user.password = hashed_password 
    new_user.visits = 1