Python中使用bcrypt遇AttributeError:找不到checkpw方法求助
解决bcrypt库的AttributeError问题
问题根源
你遇到的错误是因为当前使用的bcrypt库并非官方标准包,或包安装异常,导致缺失checkpw、hashpw这些核心方法。你改用的bcrypt.hash也不是标准库的正确用法。
修复步骤
1. 重新安装正确的bcrypt包
先卸载所有可能冲突的相关包,再安装官方版本:
pip uninstall -y bcrypt py-bcrypt pip install bcrypt
2. 修正代码中的用法与逻辑错误
官方bcrypt库有固定的密码哈希/验证流程,同时你的登录逻辑存在问题(不应在登录时重新哈希密码,而是注册时生成哈希,登录时直接对比)。修正后的代码示例:
import bcrypt from sqlalchemy.orm import Session # 假设db、engine、User等定义已正确配置 db.base.metadata.create_all(db.engine) my_session = Session(bind=engine) def login(): username = input("Please enter your username: ").strip() password = pwinput.pwinput(mask='*').strip() check_user_exists(username, password) def check_user_exists(username, password): db_user = my_session.query(User).filter_by(username=username).first() if db_user is None: # 注册流程:生成随机盐并哈希密码 salt = bcrypt.gensalt() hashed_password = bcrypt.hashpw(password.encode('utf-8'), salt) user = User(username=username, password=hashed_password) my_session.add(user) my_session.commit() print(f"New user {username} registered successfully") else: # 登录验证:用输入密码与数据库存储的哈希值对比 if not bcrypt.checkpw(password.encode('utf-8'), db_user.password): print("Wrong password") login() return print("Login successful")
关键说明
- 注册时必须用
bcrypt.gensalt()生成随机盐,再通过bcrypt.hashpw生成带盐的哈希值,确保密码安全性。 - 登录时直接调用
bcrypt.checkpw(输入密码字节, 数据库哈希字节)完成验证,无需重新生成盐。 - 确认代码目录下无自定义
bcrypt.py文件,避免覆盖第三方库。
内容的提问来源于stack exchange,提问作者Sarah Sommer
相关产品推荐
相关产品推荐

