You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 11:09:04