如何在Python/Django中验证WordPress密码哈希值?
在Django中验证WordPress数据库密码的Python实现方案
核心问题分析
WordPress当前版本使用PHP的password_hash()生成bcrypt哈希,其前缀为$2y$,但Python的bcrypt库仅兼容$2a$或$2b$前缀的哈希值,这是你之前验证失败的主要原因之一。另外,PHP的bcrypt实现会自动截断超过72字节的密码,Python中需要手动处理这一点。
可行实现步骤
安装依赖
确保安装bcrypt库:pip install bcrypt编写验证逻辑
处理哈希前缀转换,并手动截断过长密码:import bcrypt def verify_wp_password(plain_password, wp_hash): # 转换WordPress的$2y$前缀为$2b$,兼容Python bcrypt adjusted_hash = wp_hash.replace('$2y$', '$2b$').encode('utf-8') # PHP会自动截断超过72字节的密码,Python需手动处理 trimmed_password = plain_password.encode('utf-8')[:72] # 执行验证 return bcrypt.checkpw(trimmed_password, adjusted_hash)在Django中使用
从WordPress数据库获取用户的user_pass字段值,调用上述函数验证:# 假设从WP数据库查询到的用户密码哈希存在user['user_pass']中 is_valid = verify_wp_password(user_input_password, user['user_pass']) if is_valid: # 执行Django登录逻辑 pass
你之前尝试的问题说明
- 直接使用
bcrypt.verify(password, users[0]['password'])失败:WordPress哈希前缀为$2y$,Python bcrypt不识别该格式,因此提示“不是有效的bcrypt哈希值”。 - 截断前缀后提示密码长度问题:未手动截断超过72字节的明文密码,而PHP的bcrypt实现会自动处理这一步。
- 使用phpass验证失败:当前WordPress默认不再使用phpass哈希算法,因此phpass无法识别现有哈希格式。
内容的提问来源于stack exchange,提问作者tklodd
相关产品推荐
相关产品推荐

