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

Python中bcrypt密码哈希匹配失败问题排查与解决求助

问题原因与解决方案

为什么密码不匹配?

你犯了bcrypt使用的核心错误:每次调用bcrypt.gensalt()都会生成全新的随机盐,哪怕是同一个密码,两次调用hash_password得到的哈希值也完全不同。而你在验证时,错误地把用户输入的密码先哈希再传给bcrypt.checkpw——这相当于拿两个不同盐生成的哈希值做对比,自然永远不匹配。

另外,bcrypt.checkpw的设计逻辑是:第一个参数接收原始密码的字节串,第二个参数接收数据库中存储的哈希值字节串,它会自动从存储的哈希中提取盐,再用这个盐去哈希输入的密码,最后对比结果。你完全不需要自己提前哈希输入密码。

修正后的代码

只需要修改verify_password函数的验证逻辑:

def verify_password(username: str, password_to_check: str) -> bool:
    user = session.query(User).filter_by(username=username).first()
    if not user:
        print("User not found.")
        return False
    
    # 直接传入原始密码的字节串,而非哈希后的字节串
    match = bcrypt.checkpw(
        password_to_check.encode("utf-8"), user.password_hash.encode("utf-8")
    )
    if match:
        print("Password match!")
    else:
        print("Password does not match.")
        print('password_to_check:', password_to_check)
        print('user.password_hash:', user.password_hash)
    return match

修正后的运行结果

User 'alice' created.
password: my_secure_password
password_hash: $2b$12$Q3NmS7nQ.hvg7NnUk8bONO3.tVHmB0IC758BBKXXzT2omFuBp4xd2

Password match!

Password does not match.
password_to_check: wrong_password
user.password_hash: $2b$12$Q3NmS7nQ.hvg7NnUk8bONO3.tVHmB0IC758BBKXXzT2omFuBp4xd2

额外提示

  • 数据库中存储的哈希值已经包含了盐的信息,不需要单独存储盐。
  • 永远不要手动对比哈希值,一定要用bcrypt.checkpw完成验证,避免自己实现时出现安全漏洞。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 00:06:02