Flask Bcrypt 密码哈希不匹配,如何解决?

Flask Bcrypt password hash doesn’t match, How to solve it?

我正在尝试使用 Flask 制作一个简单的网络应用程序。我试着用 sqlite 运行 它。它完美地工作。唯一的问题是当我尝试在共享托管服务器上托管应用程序时,使用 MySQL 作为数据库,我遇到了一些密码匹配问题。当我查看问题时,我看到 flask-bcrypt 密码哈希不匹配。而且我不知道如何解决它。这是代码:

from flask_bcrypt import Bcrypt

app.config["SECRET_KEY"] = "super-secret-key"
cryptor = Bcrypt(app)

散列并存储在数据库中:

注意:在存储到数据库之前,我尝试使用终端和解释器来匹配密码。它匹配,但一旦存储并拉回它就不匹配了。
password = cryptor.generate_password_hash(request.form.get("password")).decode("utf-8")

user_obj = Users(password=password)
db.session.add(user_obj)
db.session.commit()

匹配:

data = Users.query.filter_by(email=form.username.data).first()
if cryptor.check_password_hash(data.password, form.password.data):
    #pass the login check
else:
    #dont pass

SQLalchemy 模型:

class Users(db.model):
    password = db.Column(db.String(50), nullable=False)

尝试改变这个:

class Users(db.model):
    password = db.Column(db.String(50), nullable=False)

对此:

class Users(db.model):
    password = db.Column(db.String(X), nullable=False)

(X = 哈希密码的长度)

当您指定 50 时,您是在告诉数据库为 50 个字符保留 space,这会在您存储密码时切断大部分散列密码。增加 space reserved 将允许您验证哈希。参考Flask SQLAlchemy Docs.

您对 Sqlite 没有任何问题的原因是它可以选择指定字符串的最大长度。 (同样适用于 PostgreSQL)