在 WordPress 6.8 中,用于散列和存储用户密码的底层算法将从 phpass 便携式散列更改为 bcrypt。采用 bcrypt 可显著增加破解密码散列的计算成本,从而加强 WordPress 中的密码安全性。
此外,应用程序密码、用户密码重置密钥、个人数据请求密钥和恢复模式密钥将从使用 phpass 切换到通过 Sodium 使用加密安全但快速的 BLAKE2b 散列算法。

网站所有者或用户无需针对这些更改采取任何措施。在更新至 6.8 后,在 WordPress 的早期版本中保存的密码和安全密钥将继续有效。用户无需更改或重置密码,已登录的用户将保持登录状态,其会话将保持有效。
当用户在更新后首次登录时 – 或者当他们下次更改密码时 – 他们的密码将自动使用 bcrypt 重新哈希并重新保存在数据库中。应用程序密码和安全密钥不会自动重新哈希,但如果现有哈希是在 WordPress 6.8 之前生成的并在到期前使用,则它将保持有效。
请注意,帖子密码目前将继续使用 phpass 便携式哈希算法。在进一步研究如何最好地改进帖子密码的哈希算法和检查机制后,这种情况可能会在未来发生变化。
可移植性
由 phpass 可移植哈希算法生成的哈希可以在不同的站点、环境和服务器之间移植。这种可移植性不会因切换到 bcrypt 和 BLAKE2b 而改变,因此您可以将数据库从一台服务器移动到另一台服务器,并更新到较新版本的PHP和 WordPress,而密码哈希将继续按预期运行。
密码处理功能更新
wp_hash_password()
和函数wp_check_password()
已更新,以使用 PHP 原生password_hash()
和password_verify()
函数以及 bcrypt 算法和 SHA-384 预哈希。这两个函数都保留对$wp_hasher
全局对象的支持,以防用于实现替代哈希机制。
wp_check_password()
函数保留对使用 phpass 散列密码的支持,这意味着现有的密码散列不会失效。
wp_password_needs_rehash()
引入了一个新函数作为 的包装器password_needs_rehash()
。如果插件需要调整其逻辑,则可以使用password_needs_rehash
过滤器。该函数也是可插入的,因此如果绝对必要,可以覆盖它。
为了避免 bcrypt 对密码施加的 72 字节长度限制,我们实施了使用 SHA-384 的预哈希处理。因此,密码哈希会使用$wp
前缀进行存储,以区别于可能通过插件使用的普通 bcrypt 哈希。默认情况下,这意味着完整前缀将是$wp$2y$
。
新的快速哈希函数
以下函数已通过 Sodium 引入作为加密安全但快速的 BLAKE2b 算法的包装器:
wp_fast_hash()
用于对使用足够高的熵随机生成的字符串进行散列,对于没有相应到期机制的值,最好超过 128 位。wp_verify_fast_hash()
用于验证通过生成的哈希值wp_fast_hash()
,并提供对 phpass 可移植哈希值的后备支持。
开发人员需要做什么吗?
wp_hash_password()
调用的代码wp_check_password()
将继续按预期工作并且不需要改变。
直接处理 phpass 哈希的代码可能需要更新,例如:
- 假设哈希上存在
$P$
前缀的代码。需要更新代码以处理新的前缀和哈希算法,特别是$wp$2y$
bcrypt 哈希的前缀和$generic$
BLAKE2b 哈希的前缀,但它还必须保留对$P$
phpass 可移植哈希使用的旧前缀的支持。理想情况下,此类代码应该更新,这样它就根本不需要检查哈希的前缀,但这取决于实现。 - 否则将直接与用户密码的哈希值交互的代码。如果直接验证此类哈希值,则应通过 进行
wp_check_password()
。 - 以其他方式直接与应用程序密码、密码重置密钥、个人数据请求密钥或恢复模式密钥的哈希值交互的代码。如果直接验证此类哈希,则应通过新功能进行验证
wp_verify_fast_hash()
。 - 任何覆盖可插入
wp_hash_password()
和wp_check_password()
函数的插件。除非这些函数专门实现另一种哈希算法,否则可以删除它们,以允许 6.8 中的 bcrypt 实现生效。
单点登录 (SSO)、社交登录或一次性登录等替代身份验证机制不太可能受到此更改的影响,但您仍应验证您的具体实施是否包括对密码哈希或安全密钥的任何处理。多因素 (MFA 和 2FA) 实施也不太可能受到此更改的影响。
那么 Argon2 怎么样?
支持 Argon2 的服务器可以在 WordPress 6.8 及更高版本中使用以下一行代码启用它:
add_filter( 'wp_hash_password_algorithm', fn() => PASSWORD_ARGON2ID );
如果需要,password_algos()
应首先使用该函数检查是否argon2id
支持。遗憾的是,不可能依赖 Argon2 在所有服务器上都可用,因为它要求libargon2
服务器上可用,并且 PHP 必须在启用 Argon2 支持的情况下构建。该sodium_compat
库不提供 Argon2 的实现。
致谢
我们不能假装将用户生成的密码切换到 bcrypt 是最近的提议。理想情况下,当 PHP 的最低支持版本增加促成这一变化时,就会进行切换。然而,这一变化现在已经做出,它有助于为密码哈希的进一步改进提供保障,包括增加新版本 PHP 中 bcrypt 的成本。
非常感谢Roots 团队维护他们的WordPress bcrypt 密码哈希包,以及Trac工单和GitHub拉取请求的众多贡献者。