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
相关产品推荐
相关产品推荐

