Python中REST接口哈希密码验证不匹配问题求助
解决PBKDF2-SHA256密码验证失败的问题
你遇到的问题核心在于登录时的密码验证逻辑错误,我们一步步来拆解和解决:
问题根源
你在登录时错误地对用户输入的密码重新生成了哈希值,然后用这个新哈希去和数据库里存储的哈希对比——但pbkdf2_sha256.encrypt()每次调用都会生成随机的salt,所以哪怕是同一个密码,两次生成的哈希字符串也完全不一样,这就是验证失败的原因。
正确的验证逻辑
passlib的verify()方法设计就是直接接收原始密码和数据库存储的哈希值,它会自动从哈希字符串里解析出之前使用的salt、rounds等参数,然后用这些参数对原始密码重新计算哈希并对比,这样就能正确验证了。
修改你的登录验证代码为:
password = data['password'] # 直接用原始密码和数据库中的哈希密码做验证 is_password_valid = pbkdf2_sha256.verify(password, user.hashed_password) if is_password_valid: # 执行登录成功的逻辑 print("登录成功") else: # 密码错误处理 print("密码不正确")
补充说明
你注册时的哈希生成逻辑是没问题的:
from passlib.hash import pbkdf2_sha256 def _get_hashed_password(self, password): return pbkdf2_sha256.encrypt(password, rounds=200000, salt_size=16)
这个函数生成的哈希字符串已经包含了salt、迭代次数等所有验证需要的信息,所以只需要把它完整存储到数据库即可,不需要单独存储salt。
内容的提问来源于stack exchange,提问作者Melissa Stewart
相关产品推荐
相关产品推荐

