如何在Python/Django中验证WordPress密码哈希值?
解决Django站点验证WordPress用户密码的问题
首先得明确你的WordPress数据库里存储的密码哈希格式——WordPress目前支持两种主要的哈希格式:传统的phpass格式(前缀为$P$或$H$)和PHP风格的bcrypt格式(前缀为$2y$)。你遇到的验证失败问题,大概率是没匹配对对应的哈希处理方式,下面给你分情况的解决方案:
情况1:密码哈希是$P$/$H$前缀(旧版WordPress或仍使用phpass的情况)
WordPress的phpass实现用的是8次迭代的MD5 portable哈希,你需要用正确配置的phpass库来验证:
首先安装phpass库:
pip install phpass
然后用以下代码验证:
from phpass import PasswordHash # 初始化符合WordPress配置的哈希验证器 wp_hasher = PasswordHash(8, True) # 第二个参数True对应WordPress的PORTABLE_HASH设置 plain_password = "用户输入的明文密码" wp_hash = users[0]['password'] # 从WordPress数据库取到的哈希值 # 验证密码 if wp_hasher.check_password(plain_password, wp_hash): print("密码验证成功") else: print("密码验证失败")
你之前用phpass.verify失败,可能是因为没正确初始化哈希器的参数——一定要指定迭代次数为8,且第二个参数设为True,这是WordPress的标准配置。
情况2:密码哈希是$2y$前缀(新版WordPress使用bcrypt的情况)
Python的bcrypt库默认不识别PHP的$2y$前缀(PHP用这个前缀区分自己的bcrypt实现),需要先把前缀替换成$2b$(标准bcrypt前缀),同时记得截断密码到72字节(bcrypt的硬性限制):
首先安装bcrypt库:
pip install bcrypt
然后用以下代码验证:
import bcrypt plain_password = "用户输入的明文密码" wp_hash = users[0]['password'] # 处理PHP的$2y$前缀,替换为标准的$2b$ if wp_hash.startswith('$2y$'): wp_hash = wp_hash.replace('$2y$', '$2b$', 1) # 截断密码到72字节(bcrypt的硬性限制) truncated_password = plain_password.encode('utf-8')[:72] # 验证密码 try: if bcrypt.verify(truncated_password, wp_hash.encode('utf-8')): print("密码验证成功") else: print("密码验证失败") except ValueError as e: print(f"哈希格式错误: {e}")
你之前直接用bcrypt.verify报错“not a valid bcrypt hash”,就是因为$2y$前缀不被Python的bcrypt库识别,替换前缀后就能正常验证了。
通用排查步骤
如果还是验证失败,建议先做这两步排查:
- 打印出从数据库获取的
users[0]['password']值,确认哈希前缀是什么,对应上面的哪种情况 - 检查明文密码是否有特殊字符,确保编码为UTF-8后再处理(避免编码不一致导致验证失败)
内容的提问来源于stack exchange,提问作者tklodd
相关产品推荐
相关产品推荐

