升级到 WordPress 6.8 后我去对了密码哈希
登录是成功的,我却在用户表前面停了一下。user_pass 开头不是那串看了好多年的 $P$,有几条已经变成 $2y$。WordPress 6.8 把默认密码哈希从 phpass 换成了 bcrypt。发布说明我扫过一眼,当时没当回事,直到
登录是成功的,我却在用户表前面停了一下。user_pass 开头不是那串看了好多年的 $P$,有几条已经变成 $2y$。WordPress 6.8 把默认密码哈希从 phpass 换成了 bcrypt。发布说明我扫过一眼,当时没当回事,直到自己翻库才对上。
旧哈希没有被一次改完
我原以为升级脚本会把所有用户重算一遍。并没有。老的 phpass 记录还在,登录时照样能过。过了之后,核心如果觉得这条哈希该更新,才写成 bcrypt。
所以一张用户表里两种前缀并存是正常的,不是导入坏了。
我只对过这两个入口
新密码走 wp_hash_password,校验走 wp_check_password,都在 wp-includes/pluggable.php。6.8 里新密码会优先用 PHP 自带的 password_hash,算法是 PASSWORD_BCRYPT。以前那套 PasswordHash 类还在,用来识别老哈希,不是给新用户继续用的。
$hash = wp_hash_password($password);
$ok = wp_check_password($password, $hash, $user_id);我自己有个小插件曾经直接 new PasswordHash 再 HashPassword。升级之后,用户在后台改一次密,库里的前缀就和核心对不上。后来我把那段删了,只留上面两个函数。
别把 user_pass 拿去当凭据
bcrypt 的成本因子是可以调的。WordPress 这次用的是固定成本,后台没有开关给我改。我没逐个小版本核对这个默认值,6.8 之后如果有人改过,以你仓库里的 pluggable.php 为准。
还有一种老写法会在这次暴露出来:把 user_pass 拼进 cookie 自己做校验。算法一换,旧 cookie 全失效。这种写法本来就不该留,只是以前哈希长期不动,问题被藏住了。