首页 > 解决方案 > Flask Bcrypt 密码哈希不匹配,如何解决?

问题描述

我正在尝试使用 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)

标签: pythonpython-3.xflaskflask-sqlalchemybcrypt

解决方案


尝试改变这个:

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 个字符保留一个空间,这会在您存储它时切断大部分散列密码。增加保留的空间将允许您验证哈希。请参阅Flask SQLAlchemy 文档。

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


推荐阅读