MySQL 8.0+密码策略由validate_password插件控制,启用后仅对新设或ALTER USER/SET PASSWORD的明文密码生效;关键参数需用SET PERSIST持久化,STRONG策略强制校验字典文件,绕过策略应谨慎使用。

MySQL 8.0+ 的密码策略由 validate_password 插件控制
MySQL 5.7.4 起引入该插件,8.0 默认启用;若未加载,执行 INSTALL PLUGIN validate_password SONAME 'validate_password.so'; 启用。插件加载后,所有新设或修改的用户密码都受策略约束,但已有用户密码不会被自动重置——除非显式执行 ALTER USER 或 SET PASSWORD。
查看和修改密码强度参数必须用 SET PERSIST 或 SET GLOBAL
关键参数包括:validate_password.length(最小长度)、validate_password.mixed_case_count(大小写字母各至少几个)、validate_password.number_count(数字个数)、validate_password.special_char_count(特殊字符个数)、validate_password.policy(策略等级:0=LOW,1=MEDIUM,2=STRONG)。注意:
-
SET GLOBAL修改后仅当前实例生效,重启丢失;生产环境务必用SET PERSIST写入mysqld-auto.cnf -
policy=STRONG会强制校验字典文件(validate_password.dictionary_file),需提前配置路径并确保 MySQL 进程有读权限 - 修改
validate_password.length为 12 后,CREATE USER 'u'@'%' IDENTIFIED BY 'abc123'会报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
SET PERSIST validate_password.length = 12; SET PERSIST validate_password.policy = 2; SET PERSIST validate_password.mixed_case_count = 2; SET PERSIST validate_password.number_count = 2; SET PERSIST validate_password.special_char_count = 1;
绕过策略只应在特定运维场景下临时使用
例如重置 root 密码、批量导入测试用户等。可用 SET SESSION validate_password.policy = LOW; 临时降级当前会话策略,但该设置对其他连接无效,且不能绕过 validate_password.length 低于 4 的限制(MySQL 硬编码最低为 4)。更安全的做法是:临时停用插件(UNINSTALL PLUGIN validate_password;),操作完再装回——但需确认业务无强合规要求(如等保、PCI DSS)。
用户创建/修改时密码策略不触发的常见原因
以下情况不会触发校验,容易误以为策略失效:
- 使用
CREATE USER ... IDENTIFIED WITH mysql_native_password AS 'hash_value'(直接指定哈希值) - 通过
mysql_upgrade或主从复制同步来的用户(密码哈希已存在,不重新校验) - 在
skip-grant-tables模式下执行UPDATE mysql.user(跳过权限系统,自然也跳过密码策略) - MySQL 8.0.19+ 中,
ALTER USER ... IDENTIFIED BY RANDOM PASSWORD生成的密码仍受策略约束,但生成逻辑内部调用策略,不是“绕过”
IDENTIFIED BY 'xxx' 或 SET PASSWORD = 'xxx')时校验。其它路径都不走这套逻辑——这点常被忽略,导致策略看似“有时生效有时不”。










