В настоящее время я работаю над созданием веб-сайта, который позволяет пользователю (вымышленно) покупать и продавать акции.Это проблема, поставленная на 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
Извиняюсь за очень длинный пост.Кто-нибудь имеет представление о том, что заставляет хэш-функцию выводить другое значение хеш-функции для (казалось бы) аналогичного ввода?
Спасибо!
РЕДАКТИРОВАТЬ: этот новый код, похоже, решил проблему:
НОВЫЙ КОД