mysql中权限管理中的密码策略与强度设置

来源:这里教程网 时间:2026-02-28 20:39:30 作者:

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'
)时校验。其它路径都不走这套逻辑——这点常被忽略,导致策略看似“有时生效有时不”。

相关推荐