WordPress 5.0+密码需用PHPass生成哈希,不可直接MD5;应执行php -r命令调用PasswordHash类生成$P$开头字符串并更新数据库,或用wp_set_password()安全重置。
WordPress管理员密码重置后无法登录?别直接用md5()硬算
wordpress 5.0+ 默认不再使用纯 md5() 存储密码,而是基于 phpass 的可加盐哈希(portable php password hashing framework)。直接对明文跑 md5('password') 写进数据库,大概率登不进去。
- 老版本(WP md5(),但已淘汰多年,现在遇到的基本都是新哈希逻辑
-
wp_users.user_pass字段值形如$P$Bjx7yOvqKzVzZzZzZzZzZzZzZzZzZz/,这是PHPass输出,不是 MD5 - 强行写入 MD5 值会导致 WordPress 认为“密码校验失败”,连错误提示都可能是模糊的“用户名或密码错误”
最稳的方式:用 WordPress 自带的wp_set_password()函数
绕过哈希细节,让 WP 自己生成合规密码哈希——这比手算安全,也比改 SQL 更可靠。
- 必须在 WordPress 环境下执行,比如新建一个临时
reset-pass.php放在网站根目录 - 开头需加载核心:
require_once(ABSPATH . 'wp-load.php'); - 调用前确认用户 ID 或用户名存在,避免静默失败:
$user = get_user_by('login', 'admin'); - 执行重置:
wp_set_password('newpass123', $user->ID); - 成功后删掉该文件,避免被扫描利用
如果只能直连数据库(比如环境没 PHP 执行权)
那就得模拟 PHPass 行为。不能手写 MD5,但可以用一行 PHP 快速生成正确哈希值:
php -r "require 'wp-includes/class-phpass.php'; \$p = new PasswordHash(8, 1); echo \$p->HashPassword('mynewpass') . \"\n\";"
把输出结果(一长串以 $P$ 开头的字符串)复制进 wp_users.user_pass 字段即可。
- 注意路径:命令中的
wp-includes/class-phpass.php要能被找到,否则报错failed to open stream - 参数
8是迭代次数(log2),1表示启用兼容模式(支持更老的 PHP 版本),别改成0,否则可能不兼容当前 WP - MySQL 更新语句要加引号:
UPDATE wp_users SET user_pass = '$P$B...' WHERE user_login = 'admin';
为什么不用wp_update_user()?它和wp_set_password()有啥区别
wp_update_user() 内部会调用 wp_set_password(),但只在传入 'user_pass' 键时才触发密码重哈希;其他字段更新不会碰密码。
- 安全起见,建议显式用
wp_set_password(),语义清晰、职责单一 - 若用
wp_update_user(),必须传关联数组:wp_update_user(['ID' => 1, 'user_pass' => 'newpass']),漏掉ID会操作当前登录用户 - 两者都不校验旧密码,所以重置场景下无需知道原密码










