python - 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)
解决方案
尝试改变这个:
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)
推荐阅读
- json - -- 带有完成 URLRequest 的函数调用 - JSON
- python - 大组 x,y 坐标。找到彼此一定距离内的任何有效方法?
- python - 从句子中提取块
- google-sheets-query - 在单元格中使用“like”来引用谷歌表格中的最后四位数字
- php - 使用 PHPWord 将 DOCX 转换为 PDF 时没有样式
- css - 为什么同一设备和操作系统上的网页之间的设备像素比会发生变化?
- ios - Swift 4 - 如何将自定义 SCNGeometry 创建为多边形
- javascript - 如何在 Chrome 扩展开发中添加带有点击监听器的动态按钮?
- r - 如何获取返回空节点集的跨度内容?
- r - 预订网站中的观星者