You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需插件:将WordPress默认哈希算法从MD5改为ARGON2ID

WordPress 替换默认密码哈希为Argon2ID的实现方案

1. 实现Argon2ID哈希替代默认MD5(不推荐直接修改pluggable.php)

注意:直接修改wp-includes/pluggable.php等核心文件会在WordPress更新时被覆盖,更稳妥的方式是将代码放在当前主题的functions.php中,或者创建一个极简单文件自定义插件(无冗余代码)。

你提供的代码存在几个关键问题:

  • WordPress核心密码哈希函数是wp_hash_password(),而非你定义的hash_password()
  • 无需手动生成salt,password_hash()会自动生成符合安全规范的随机salt,手动指定反而可能引入风险
  • 缺少旧MD5哈希的验证兼容逻辑

修正后的可运行代码如下:

/**
 * 重写WordPress密码哈希函数,使用Argon2ID算法
 */
function wp_hash_password($password) {
    // 根据服务器性能调整参数,平衡安全性与负载
    $options = [
        'memory_cost' => 65536, // 64MB,建议不低于32MB
        'time_cost'   => 4,     // 迭代次数,建议不低于3
        'threads'     => 4      // 线程数,建议设为CPU核心数的一半
    ];

    return password_hash($password, PASSWORD_ARGON2ID, $options);
}

/**
 * 重写密码验证函数,兼容旧MD5哈希,验证成功后自动升级为Argon2ID
 */
function wp_check_password($password, $hash, $user_id = '') {
    // 优先验证Argon2ID格式的哈希
    if (str_starts_with($hash, '$argon2id$')) {
        return password_verify($password, $hash);
    }

    // 兼容WordPress旧版MD5哈希(含$P$前缀的哈希)
    $is_valid = ($hash === md5($password)) || ($hash === wp_hash_password_old($password));
    
    // 验证成功且用户存在时,自动更新密码为Argon2ID哈希
    if ($is_valid && $user_id) {
        wp_set_password($password, $user_id);
    }

    return $is_valid;
}

// 备份原WordPress哈希函数,用于兼容旧版哈希验证
function wp_hash_password_old($password) {
    global $wp_hasher;
    if (empty($wp_hasher)) {
        require_once ABSPATH . WPINC . '/class-phpass.php';
        $wp_hasher = new PasswordHash(8, true);
    }
    return $wp_hasher->HashPassword($password);
}

如果坚持要修改pluggable.php,只需将上述代码添加到文件末尾,但强烈不推荐这种方式——WordPress更新会直接覆盖该文件,导致配置丢失。

2. 是否需要修改其他文件?

不需要修改其他核心文件。上述代码已经覆盖了密码哈希生成、旧密码验证、自动升级的全部逻辑,所有依赖WordPress默认密码函数的场景(用户注册、修改密码、登录验证)都会自动适配Argon2ID。

3. 更新WordPress或PHP时避免配置丢失的方法

  • 绝对不要修改核心文件:WordPress更新会完全覆盖wp-includes、wp-admin等目录下的文件,所有核心修改都会丢失。
  • 使用主题functions.php:将自定义代码放在当前激活主题的functions.php中,WordPress更新不会影响主题文件;若需更新主题,建议使用子主题存放自定义代码,避免主题更新覆盖。
  • 创建极简自定义插件:新建文件夹argon2id-password-hash,在其中创建argon2id-password-hash.php文件,内容如下:
<?php
/*
Plugin Name: Argon2ID Password Hash
Description: 替换WordPress默认密码哈希为Argon2ID,兼容旧密码
Version: 1.0
Author: Custom
*/

// 插入前面的wp_hash_password、wp_check_password、wp_hash_password_old函数代码

将该文件夹上传到wp-content/plugins/目录,后台启用插件即可。WordPress和PHP更新都不会影响插件文件,只要不删除该插件,配置就会保留。

额外注意事项

  • 确保PHP版本≥7.3,且主机已启用Argon2扩展(PHP 7.3+默认包含,部分主机可能需手动开启)
  • 可根据服务器负载调整Argon2ID参数:memory_cost、time_cost越高,安全性越强,但会增加服务器CPU和内存消耗,建议在测试环境调整到合适值

内容的提问来源于stack exchange,提问作者AYNTK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 18:57:41