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生成的密码仍受策略约束,但生成逻辑内部调用策略,不是“绕过” 密码策略真正起效的边界很明确:仅当 SQL 显式包含明文密码字符串(
IDENTIFIED BY 'xxx'或
SET PASSWORD = 'xxx')时校验。其它路径都不走这套逻辑——这点常被忽略,导致策略看似“有时生效有时不”。
