MySQL 8.0 默认启用 validate_password 组件而非插件,STRONG 策略需显式安装组件、设 policy=2 并手动配置 length、mixed_case_count、number_count、special_char_count、check_user_name 及有效 dictionary_file,否则退化为 MEDIUM。

MySQL 8.0 默认启用 validate_password 插件,但它的策略规则不是“开箱即用”的强策略——STRONG 策略必须显式安装组件、手动配置参数、且依赖字典文件才真正生效。直接改 my.cnf 或执行 SET GLOBAL 很可能白忙一场。
先确认 validate_password 是插件还是组件?
MySQL 8.0.16+ 已将密码验证功能从插件(INSTALL PLUGIN)升级为组件(INSTALL COMPONENT),老写法会报错 ERROR 3510 (HY000)。
- 查是否已加载:执行
SELECT * FROM mysql.component WHERE component_id LIKE 'validate_password%';—— 若无返回,说明未安装 - 正确安装方式(Linux/macOS):
INSTALL COMPONENT 'file://component_validate_password'; - Windows 路径需写成:
INSTALL COMPONENT 'file://C:/Program Files/MySQL/MySQL Server 8.0/lib/plugin/component_validate_password.dll';(路径以实际plugin目录为准) - 若提示
Component not found,说明当前二进制包不带该组件,需重装官方 RPM/DEB 包或升级 MySQL
STRONG 策略下必须显式设置的参数
policy = STRONG(即值为 2)是启用密码历史、字典检查等高级特性的硬门槛,但只设它还不够——所有子参数都得手动指定,否则 MySQL 会静默忽略。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
-
SET PERSIST validate_password.policy = 2;(必须用PERSIST,否则重启失效) -
SET PERSIST validate_password.length = 12;(等保三级要求至少 12 位) -
SET PERSIST validate_password.mixed_case_count = 2;(大小写字母各 ≥2,不能只靠policy=STRONG自动推导) -
SET PERSIST validate_password.number_count = 2;和special_char_count = 1; -
SET PERSIST validate_password.check_user_name = ON;(防密码含用户名,如root123) - 关键陷阱:
validate_password.dictionary_file必须设为有效路径(如/usr/share/dict/words),否则 STRONG 退化为 MEDIUM,字典检查完全失效
为什么改了参数还是拦不住弱密码?
常见于三类误操作:
- 只在
my.cnf里写validate_password.length = 12却没运行SET PERSIST—— 启动时读一次,后续修改无效 - 执行了
SET GLOBAL但忘了FLUSH PRIVILEGES(虽然 8.0 多数情况不需要,但部分版本对check_user_name等参数仍需刷新) - 用
ALTER USER ... IDENTIFIED WITH mysql_native_password BY 'xxx'绕过校验 —— 这种方式跳过了validate_password的全部检查,策略形同虚设 - 测试时用了已存在的用户(如旧密码哈希格式为
mysql_native_password),而策略只对新设/明文重置生效;务必用全新用户实测:CREATE USER 'test'@'localhost' IDENTIFIED BY 'Abc123!';和'password123'对比是否报ERROR 1819
最易被忽略的一点:validate_password.history 和 reuse_interval 在 policy 下完全不生效,且不报错——很多人设了 5 次历史却始终能重用旧密码,问题就出在这里。

















