mysql 8.0需显式安装validate_password组件并配置strong策略及length=12、mixed_case_count=2等参数,写入my.cnf持久化,实测验证拦截弱密码,避免业务中断。

MySQL 8.0 默认不启用密码强度校验,validate_password 组件必须显式安装并调优,否则任何密码(包括 '123456')都能通过,直接不满足等保三级对“密码复杂度”的强制要求。
确认并安装 validate_password 组件
MySQL 8.0 将密码验证功能内置为组件而非插件,INSTALL PLUGIN 命令在 8.0.16+ 已废弃,用错会报错 ERROR 3510 (HY000):
- 先查是否已加载:
SELECT * FROM mysql.component WHERE component_id LIKE 'validate_password%'; - 未安装则执行:
INSTALL COMPONENT 'file://component_validate_password';(路径必须带file://前缀) - 若提示
Component not found,说明二进制包未包含该组件,需升级 MySQL 或从官方 RPM/DEB 包重装
设置符合等保三级的强度参数
等保三级只要求“8位+数字/大小写字母/特殊字符”,但仅设 validate_password.length = 8 不够——policy = MEDIUM 下,mixed_case_count、number_count、special_char_count 默认虽为 1,但若未显式 SET,部分版本可能沿用旧值或忽略校验:
- 必须逐项显式配置(在线生效):
SET GLOBAL validate_password.policy = 'STRONG';SET GLOBAL validate_password.length = 12;SET GLOBAL validate_password.mixed_case_count = 2;SET GLOBAL validate_password.number_count = 2;SET GLOBAL validate_password.special_char_count = 1; -
validate_password.check_user_name = ON强烈建议开启,防止密码含用户名(如user123) - 避免只改内存变量:必须在
/etc/my.cnf的[mysqld]段落中追加对应配置,否则重启后失效
验证策略是否真实生效
很多人执行完 SET 就以为完成了,但策略是否真正拦截弱密码,得靠实测:
- 尝试建用户:
CREATE USER 'test'@'localhost' IDENTIFIED BY 'Abc123!';→ 应成功 - 再试:
CREATE USER 'test2'@'localhost' IDENTIFIED BY 'password123';→ 必须报ERROR 1819 (HY000) - 检查当前策略快照:
SHOW VARIABLES LIKE 'validate_password%';,确认所有目标变量值与预期一致 - 特别注意:
validate_password.dictionary_file若设为空字符串或路径无效,STRONG策略会退化为MEDIUM,导致字典检查失效
避开业务连接中断这个致命坑
策略一旦生效,所有 ALTER USER ... IDENTIFIED BY 和新建用户操作都会被校验。如果业务脚本里硬编码了 8 位弱密码,或者运维工具(如某些老版本 Navicat、DBeaver)自动生成的密码不达标,会直接连接失败:
- 上线前务必在测试库用真实建库/改密脚本跑通全流程
- 不要把
validate_password.length设为 16 而不通知开发,否则批量初始化用户会卡死 - 已有用户密码不会被自动重置,但下次
ALTER USER时就会触发校验——这点常被当成“策略没生效”而反复重装组件
真正难的不是命令敲几行,而是让策略在不影响业务的前提下咬住安全底线:参数值要够严,生效范围要可控,错误反馈要可追溯。别等等保测评当天才发现某个定时任务因密码不合规静默失败了。











