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

求助:check_password_hash函数为何始终返回False?

check_password_hash 始终返回False的问题排查

我遇到了check_password_hash函数始终返回False的问题,相关代码如下:

哈希生成与存储代码

生成密码哈希:

hashed_password = generate_password_hash('password',method='pbkdf2:sha1:2000', salt_length=15)

存入数据库:

db.execute(
            "INSERT INTO users (username, hash, Fullname, email) VALUES(?, ?,?,?)", username, hashed_password, Fullname, mail)

验证代码

查询并验证密码:

# Query database for username
rows = db.execute("SELECT * FROM users WHERE username = ?",
                  request.form.get("username"))

# Ensure username exists and password is correct
if len(rows) != 1:
    return apology("invalid username and/or password -0", 403)

if not check_password(rows[0]["hash"], request.form.get("password")):

自行封装的验证函数:

# check for password
def check_password(hash, password):
    return check_password_hash(hash, password)

可能的解决方向

1. 检查数据库字段长度

pbkdf2:sha1:2000生成的哈希字符串长度通常在70字符以上,如果数据库中hash字段的长度限制过短(比如VARCHAR(50)),会导致哈希被截断,验证必然失败。

  • 处理:将users表的hash字段修改为VARCHAR(255)或更长的类型,重新生成哈希存入数据库。

2. 修正数据库插入的参数传递

你的db.execute调用中,参数没有包装成元组,这会导致参数传递错误,最终存入数据库的可能不是正确的哈希值。正确写法应该是:

db.execute(
    "INSERT INTO users (username, hash, Fullname, email) VALUES(?, ?,?,?)", 
    (username, hashed_password, Fullname, mail)
)

3. 确认验证时的密码正确性

打印request.form.get("password")和数据库中取出的hash值,确认:

  • 用户输入的密码是否和生成哈希时的测试密码(比如示例中的password)完全一致,没有大小写、空格或其他字符差异。
  • 数据库中取出的哈希值和生成时的哈希值完全相同,没有被篡改或截断。

4. 排查依赖版本兼容性

如果生成哈希和验证的环境中Flask-Bcrypt版本不一致,极端情况下可能出现算法兼容问题。可以尝试使用默认参数生成哈希测试:

hashed_password = generate_password_hash('password')

再进行验证,看是否能正常匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 04:55:28