WordPress密码哈希以$P$开头,基于PHPass(Blowfish变种),而CI4默认用password_hash()(Argon2ID等),二者不兼容;校验WP密码须用PasswordHash类的CheckPassword方法,不可用CI4原生password_verify。

WordPress 的密码加密机制和 CodeIgniter 4(CI4)默认的密码哈希方式不兼容,直接比对会失败。这不是“规则特殊”,而是两者底层实现逻辑不同:WP 使用带 salt 的 PHPass(基于 Blowfish 的 crypt),而 CI4 默认用 password_hash()(PASSWORD_ARGON2ID 或 PASSWORD_DEFAULT,取决于 PHP 版本),两者不可互换。
WP 密码加密的核心特征
- 格式固定:以
$P$开头(如$P$BkZq7y6V1Qz8X9W0a1b2c3d4e5f6g7h) - 本质是 一次 bcrypt 变种(PHPass)哈希,不是 MD5 或 SHA 系统
- 每次哈希结果不同(因 salt 随机生成),但能通过
wp_check_password()正确验证 - 依赖 WordPress 内置的
PasswordHash类(wp-includes/class-phpass.php)
CI4 用户密码校验需适配 WP 规则
若你正在迁移用户或对接 WP 用户表(如 wp_users.user_pass),CI4 不能直接用 password_verify() 校验 WP 密码字段。必须:
- ✅ 引入 WP 的密码校验逻辑(推荐)
- ✅ 或在 CI4 中复现 PHPass 验证流程(不推荐,易出错)
推荐做法:调用 WordPress 原生校验函数
// 在 CI4 环境中临时加载 WP 核心密码类(确保路径正确)
require_once WRITEPATH . 'wp-includes/class-phpass.php';
$hasher = new \PasswordHash(8, true); // 第一个参数为迭代次数,true 表示兼容性模式
$is_valid = $hasher->CheckPassword($input_password, $wp_stored_hash);
if ($is_valid) {
// 登录成功
}⚠️ 注意:
$wp_stored_hash必须是从wp_users.user_pass字段原样读取的完整字符串(如$P$B...),不能截断或转义。
不建议的做法:尝试用 CI4 自带 hasher 解析 WP 密码
CI4 的 Password service(如 password_verify())无法识别 $P$ 前缀格式,会直接返回 false。强行转换或截取哈希片段会导致验证失效。
兼容场景下的关键提醒
- 若新用户注册走 CI4 流程,密码应单独存入 CI4 用户表,不要混写到
wp_users - 若共用
wp_users表,所有密码操作(注册/重置/校验)必须统一用 WP 的wp_hash_password()/wp_check_password() - 不要试图“解密”或“还原”WP 密码 —— 它是单向哈希,不可逆
迁移过渡期实用建议
- 新系统上线前,导出 WP 用户密码哈希值(
user_pass字段),不做任何修改直接入库 - 登录时优先调用 WP 校验逻辑;验证通过后再同步登录态到 CI4 Session 或 JWT
- 后续可选:用户首次成功登录后,在 CI4 侧用
password_hash()重置密码并更新到自己的用户表,逐步脱离 WP 依赖
本质上不是“加密规则特殊”,而是生态隔离 —— WP 和 CI4 各自维护独立的密码安全体系。强行桥接不如明确边界、复用原生能力。

















