Неверная соль в bcrypt при проверке pw - PullRequest
0 голосов
/ 03 августа 2020

Работа с flask python. Когда я пытаюсь сравнить хешированный пароль, зашифрованный с помощью bcrypt.hashpw (), скажите, что недействительная соль.

Теперь я тестирую его, и если я поставлю это if, оператор работает, но только если в поле пароля в форме html Я вставляю хешированный пароль (дело в том, что мне нужно поставить обычный пароль). Итак, сравнение, я одобряю поле формы в html, и соединение с базой данных, чтобы принять пароль пользователя, работает только сбой, когда мне нужно поставить bcrypt .checkpw (password_in_the_login_form. html, password_hashed_in_the_db) Это каждый раз говорит Invalid Salt, вот мой код:

app.config['MYSQL_HOST'] = 'localhost'
app.config['MYSQL_USER'] = 'root'
app.config['MYSQL_PASSWORD'] = '01b0cfa6c076da9264d7ea8b44967445'
app.config['MYSQL_DB'] = 'flaskdb'
app.config['MYSQL_CURSORCLASS'] = 'DictCursor'
mysql = MySQL(app)

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        email = request.form['Email']
        password = request.form['Password']

        curl = mysql.connection.cursor(MySQLdb.cursors.DictCursor)
        curl.execute("SELECT * FROM users WHERE Email=%s",(email,))
        user = curl.fetchone()        

        if len(user) > 0:
            if user["Password"] == password:               
                session['Email'] = email
                session['Nickname'] = user["Nickname"]
                return render_template("profile.html")
            else:
                return "Error password and email not match"
        else:
            return "Error user not found"
    else:
        return render_template("login.html")
  

@app.route('/logout')
def logout():
    session.clear()
    return redirect(url_for("home")) 

@app.route("/signup", methods=["GET", "POST"])       
def signup():
    if request.method == 'GET':
        return render_template("signup.html")
    else:
        nickname = request.form['Nickname']
        firstName = request.form['First_Name']
        lastName = request.form['Last_Name']
        email = request.form['Email']
        password = request.form['Password'].encode('utf-8')
        
        hash_password = bcrypt.hashpw(password, bcrypt.gensalt(14))

        cur = mysql.connection.cursor()
        cur.execute("INSERT INTO users (Nickname, First_Name, Last_Name, 
        Email, Password) VALUES (%s,%s,%s,%s,%s)",(nickname,firstName,lastName,email,hash_password,))
        mysql.connection.commit()
        return redirect(url_for('home'))

if __name__ == '__main__':
    app.secret_key = 'bb8ef1d0a8de0bf09b4b2aaee861a7d5'
    app.run(debug=True)

И html формирует

    <form action="/signup" method="POST">
    <input type="text" class="form-field" name="Nickname" placeholder="Nickname">
    <input type="text" class="form-field" name="First_Name" placeholder="First Name">
    <input type="text" class="form-field" name="Last_Name" placeholder="Last Name">
    <input type="email" class="form-field" name="Email" placeholder="Email">
    <input type="password" class="form-field" name="Password" placeholder="Password">
    <button type="submit" class="signup-btn">SIGNUP</button>
    </form>

<form action="/login" method="POST">
  <input type="email" class="form" name="Email"><br>
  <input type="password" class="form" name="Password"><br>
  <button type="submit" class="login-btn">LOGIN</button>
</form>

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Спасибо, но это (я думаю) именно то, что у меня есть. Я не знаю, почему у меня ошибка, у меня есть .hashpw, который имеет sh пароль и хранит его в базе данных, и это нормально, я вижу пароль в зашифрованном виде, но .checkpw для сравнения пароля в форме к паролю в базе данных не удается, говорит Invalit salt, код это именно для сравнения:

if bcrypt.checkpw(password, userPassworddb):

Где пароль - это пароль, который пользователь ввел в форму входа с уже .encode ('utf-8 ') и userPassworddb - это пароль, зашифрованный в базе данных (необходимо также преобразовать userPassworddb.encode (' utf-8 '), потому что если я этого не сделаю, отладчик говорит, что мне нужно кодировать перед сравнением)

В логин из в html у меня это:

<form action="/login" method="POST">
  <input type="email" class="form" name="Email"><br>
  <input type="password" class="form" name="Password"><br>
  <button type="submit" class="login-btn">LOGIN</button>
</form>
0 голосов
/ 03 августа 2020

Трудно точно определить, что происходит не так, потому что нам не хватает MCVE и следов ошибок , в любом случае мы можем хотя бы догадаться, что может быть причина.

Фиктивная строка

Во-первых, у вас есть проблема в этой строке:

password = b'password'

Вы никогда не сохраняли пароль пользователя, вместо этого все они были заменены значение password. Закомментируйте эту строку в своей функции, и вы сможете сохранить вводимый пользователем пароль вместо фиктивного значения.

К сожалению, восстановить уже сохраненный пароль невозможно, поскольку вы потеряли исходную информацию о пользователе.

Рабочий процесс

Затем мы можем подтвердить, что bcrypt работает должным образом:

import bcrypt
saltp = bcrypt.gensalt(14)                       # b'$2b$14$7QmgF.1F4dTKeb8o8dprEu'
hashp = bcrypt.hashpw('abcdef'.encode(), saltp)  # b'$2b$14$7QmgF.1F4dTKeb8o8dprEuo2T2Y908hdZan9fb.LDWDuibPl/SLpm'
bcrypt.checkpw('abcdef'.encode(), hashp)         # True

Из этого фрагмента выше вы должны попробовать все этапы вашего процесса (добавьте MySQL I / O с fre sh паролями), чтобы выделить, какой из них вызывает проблему:

  • Пароль, собранный с локалью на стороне клиента (str);
  • Хеширование пароля с использованием bcrypt (bytes) на стороне сервера;
  • Пароль ha sh хранится в MySQL (затронутый первой ошибкой, мы до сих пор не знаем, какой тип вы его сохранили и если он должен экранированный или нет, прочтите комментарий)
  • Пароль ha sh получен из MySQL;
  • Пароль ha sh по сравнению с вводом пользователя с использованием bcrypt;

Опасность

* 1 044 * Я предполагаю: проблема находится между Flask и MySQL, вы не сохраняете то, что вы думаете, из-за проблемы с приведением bytes (BLOB) vs str (TEXT). Скорее всего, поэтому вам пришлось настроить user["Password"].encode('utf-8'), но это могло привести к другой ошибке, потому что вы не избежали своего хешированного пароля: вам, вероятно, нужно избежать хешированного пароля как , в котором вы пытаетесь сохранить двоичные данные в текстовое поле .

Мой совет: на каждом этапе потока паролей проверяйте значения password / ha sh и подтверждайте, что вы обрабатываете то, что вы думаете. Когда возникает несоответствие, вы определяете источник ошибки. Затем явно опишите это в своем POST, если вам все еще нужна помощь.

...