升级到 WordPress 6.8 后我去对了密码哈希

· wordpress · 阅读 1
摘要

登录是成功的,我却在用户表前面停了一下。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 全失效。这种写法本来就不该留,只是以前哈希长期不动,问题被藏住了。