Хеш-функция не возвращает одинаковый вывод для идентичного ввода - PullRequest
0 голосов
/ 16 декабря 2018

В настоящее время я работаю над созданием веб-сайта, который позволяет пользователю (вымышленно) покупать и продавать акции.Это проблема, поставленная на 9 в курсе компьютерных наук Гарвардского университета CS50.Моя программа компилирует, функционирует и проходит все проверки.Однако последние несколько дней я застрял, пытаясь реализовать опцию смены пароля.

На странице смены пароля я предлагаю пользователю ввести свой старый пароль.Затем пользователь должен ввести свой новый пароль.Наконец, пользователь должен подтвердить свой новый пароль еще раз.

Однако моя функция хеширования, похоже, выводит другой хэш, когда пользователь вводит свой старый пароль, чем это было, когда он регистрировался с этим паролем.Это приводит к тому, что моя проверка сравнения между хешированным паролем в базе данных и пользовательским вводом всегда возвращает false.

Ниже приведен код Python для реализации смены пароля.Ниже приведен HTML-код фактической страницы, на которой пользователь может изменить свой пароль.

@app.route("/change", methods=["GET", "POST"])
@login_required
# PERSONAL TOUCH: <Allows user to change their password>
def change():
"""Allows user to change their password"""

if request.method == "GET":
    return render_template("change.html")

else:

    # Returns an error if Password is left blank
    if not request.form.get("originalpassword"):
        return apology("User must submit their original Password.", 400)

    elif not request.form.get("newpassword"):
        return apology("User must submit a new Password.", 400)

    elif not request.form.get("newconfirmation"):
        return apology("User must confirm their new Password", 400)

    # Hashes the Password
    Password = request.form.get("originalpassword")
    print("GIVEN PASSWORD: ", Password)
    HashedPassword = generate_password_hash(Password, method='pbkdf2:sha256', salt_length=8)

    # Returns an error if the user typed in a non-valid original password
    OldHashedPassword = db.execute("SELECT hash FROM users WHERE id = :id", id=session["user_id"])
    Old_HPW = OldHashedPassword[0]["hash"]

    print("given hash: ", HashedPassword)
    print("actual hash: ", Old_HPW)

    print("=====\n",OldHashedPassword,"\n=====\n")

    if not Old_HPW == HashedPassword:
        return apology("Submitted password is not valid.")

    # Returns an error if Password and Confirmation are not identical
    if not request.form.get("newpassword") == request.form.get("confirmpassword"):
        return apology("New Password and Confirmation must be identical.", 400)

    # Hashes the new Password
    NewPassword = request.form.get("newpassword")
    NewHashedPassword = generate_password_hash(NewPassword, method='pbkdf2:sha256', salt_length=8)

    # Insert the new Password into the database
    insertPW = db.execute("INSERT INTO users (hash) VALUES(:hash)", hash=NewHashedPassword)

    return redirect("/")

и HTML-код:

HTML-код

Я включил несколько операторов печати для отладки.Я зарегистрировал новую учетную запись с именем пользователя «q» и паролем «q».Затем я попытался изменить пароль на «qq».Во время регистрации ввод 'q' приводил к следующему хешу:

pbkdf2: sha256: 50000 $ sBxqbmza $ e35dd4e61eb186af014e5e1ce3b73450b1361baabdd2f5f4559ad83ef0d5b45b

1019 * в исходный код q, однако, при вводе исходного кода q, однако, при вводе q1 в исходный код q, однако, вводится исходный код q, однако при вводе в исходный код q, однако, вводится исходный код q1, когда вводится исходный код q1, однако, в исходной форме q вводят q1, а также исходный код q1.В этом поле функция generate_password__hash возвращает хеш:

pbkdf2: sha256: 50000 $ iAjKAPM1 $ f7644f34f21864062efa2f3e3f3ea0a89a8a3391a0223c1a62fa7cbaab012a71 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *, 10 * 22, *, *, *, *, *, *, *,, *,,,,,,,,,,,,,,,,,,,,,,,1026

данный хэш:

1029 * PBKDF2: sha256: 50000 $ iAjKAPM1 $ f7644f34f21864062efa2f3e3f3ea0a89a8a3391a0223c1a62fa7cbaab012a71 1031 * фактический хэш: 1033 * PBKDF2: sha256: 50000 $ sBxqbmza $ e35dd4e61eb186af014e5e1ce3b73450b1361baabdd2f5f4559ad83ef0d5b45b

Извиняюсь за очень длинный пост.Кто-нибудь имеет представление о том, что заставляет хэш-функцию выводить другое значение хеш-функции для (казалось бы) аналогичного ввода?

Спасибо!

РЕДАКТИРОВАТЬ: этот новый код, похоже, решил проблему:

НОВЫЙ КОД

1 Ответ

0 голосов
/ 16 декабря 2018

Как указано в этом ответе , некоторые библиотеки генерируют саму соль, а вы ее не предоставляете.В этой библиотеке вы можете указать только размер соли.Из doc

werkzeug.security.generate_password_hash(password, method='pbkdf2:sha256', salt_length=8)

Хешируйте пароль с помощью данного метода и добавляйте строку указанной длины.Формат возвращаемой строки включает метод, который был использован для того, чтобы check_password_hash () мог проверить хеш.

Формат для хешированной строки выглядит следующим образом:

method$salt$hash

Если вы хотите хранить соль, проанализируйте ее по результату.Но в этой библиотеке есть еще одна функция для проверки / проверки паролей:

werkzeug.security.check_password_hash(pwhash, password)

проверка пароля по заданному соленому и хешированному значению пароля.

Итак;

Для входа в систему или для смены паролей используйте;

generate_password_hash

Для проверки паролей используйте;

check_password_hash
...