You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask+MySQL项目中check_password_hash校验正确密码仍失败问题求解

Flask+MySQL密码哈希校验始终失败的故障原因及修复方案

核心故障原因

  • 存储过程入参长度不匹配
    存储过程定义的用户名入参p_username长度为VARCHAR(20),但用户表的user_username字段长度为VARCHAR(45),如果实际用户名长度超过20,存储过程会自动截断入参,导致无法匹配到正确的用户记录,拿到的哈希值和输入密码自然不匹配。
  • 字节类型哈希值转字符串错误
    如果使用MySQLdb等Python数据库驱动,从数据库查询得到的user_password字段值会是bytes字节类型,直接用str(data[0][3])转换会得到类似b'$pbkdf2-sha256$xxxx'的带前缀字符串,和生成哈希时的原始字符串格式不一致,直接导致校验失败。
  • 全局数据库连接/游标复用异常
    代码中直接使用全局的conn和cursor对象,多请求并发或者前序请求残留未读取的结果集时,会导致本次查询拿到的data结果不是当前用户的正确数据,哈希值匹配自然失败。

修复方案

  • 修正存储过程入参长度,和表字段长度保持一致
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_validateLogin`(
IN p_username VARCHAR(45)
)
BEGIN
    select * from tbl_user where user_username = p_username;
END
  • 修正哈希值的类型转换逻辑,避免bytes转字符串异常
# 替换原代码中的check_password_hash判断逻辑
stored_hash = data[0][3]
if isinstance(stored_hash, bytes):
    stored_hash = stored_hash.decode('utf-8')
if check_password_hash(stored_hash, _password):
  • 每次请求单独创建数据库连接和游标,不要复用全局连接对象,避免不同请求的结果串扰。
  • 可选优化:使用字典游标查询,按字段名取结果而非下标,避免后续表结构调整后下标错位的问题
# 初始化游标时指定字典格式
cursor = conn.cursor(dictionary=True)
# 取值时直接用字段名,无需关心字段顺序
stored_hash = data[0]['user_password']

内容的提问来源于stack exchange,提问作者Debadas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 10:54:05