首页/数据/数据库速查/密码复杂度与过期策略(validate_password)

密码复杂度与过期策略(validate_password)

用 validate_password 组件强制强度:长度、大小写数字符号组合、字典校验;账号级还支持密码过期与历史密码复用限制。

数据库速查数据更新于 2026-10-13

密码策略组件是什么

validate_password 是 MySQL 8.0 的密码强度组件,在 CREATE USER、ALTER USER、SET PASSWORD 时校验新密码的长度、大小写、数字与符号组合,并可选做字典比对。它只管新密码的强度,不改变认证插件本身的加密方式;账号级另有过期、历史复用与失败锁定策略。

基本信息

适用MySQL 8.0 组件式;5.7 为同名插件
安装INSTALL COMPONENT 'file://component_validate_password';
强度档位LOW / MEDIUM / STRONG
账号级策略PASSWORD EXPIRE / HISTORY / FAILED_LOGIN_ATTEMPTS

策略项含义

参数含义建议取值
validate_password.policy校验档位内部账号 MEDIUM 起步,对外账号 STRONG
validate_password.length新密码最小长度12 位以上,结合业务输入习惯
mixed_case_count / number_count / special_char_count各类字符最少数量各 1,避免只堆长度
validate_password.dictionary_file字典文件路径,拒绝常见弱口令有合规要求时配置
PASSWORD EXPIRE INTERVAL n DAY账号密码有效期90 天或按合规基线
PASSWORD HISTORY n禁止复用最近 n 个密码5
FAILED_LOGIN_ATTEMPTS / PASSWORD_LOCK_TIME连续失败锁定(8.0.19+)5 次失败锁定 1 天

安装与全局配置

安装与全局配置
INSTALL COMPONENT 'file://component_validate_password';   # 8.0 组件式安装
SHOW VARIABLES LIKE 'validate_password%';                  # 确认各参数当前值
SET GLOBAL validate_password.policy = STRONG;              # 调整档位
SET GLOBAL validate_password.length = 12;                  # 最小长度
SET GLOBAL validate_password.mixed_case_count = 1;         # 至少 1 个大小写字母
-- 持久化:validate_password.policy 等写进 my.cnf 的 [mysqld] 段

账号级密码策略

账号级密码策略
ALTER USER 'app'@'%' PASSWORD EXPIRE INTERVAL 90 DAY;                # 90 天过期
ALTER USER 'app'@'%' PASSWORD HISTORY 5;                            # 禁用最近 5 个旧密码
ALTER USER 'app'@'%' FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LOCK_TIME 1;  # 连错 5 次锁 1 天
SELECT user, host, password_lifetime FROM mysql.user;               # 核对生效结果

典型使用场景

  • 等保或内审要求统一口令复杂度,用组件做强制校验
  • 新开对外账号时同步配置过期周期与历史密码限制
  • 在线爆破压力大时给业务账号加失败锁定
  • 排查「口令符合规范却改不了」,核对档位与字符类别下限
  • 交接期轮换密码,用 PASSWORD EXPIRE 强制相关账号改密
把策略调成 STRONG 不会让已有弱密码自动失效,必须对老账号执行 PASSWORD EXPIRE 才能强制改密,否则合规检查仍然不通过。
失败锁定与连接池重试叠加可能把业务账号锁死:上线前先确认应用的失败重试次数小于账号锁定次数,避免一次网络抖动就锁号。

口令治理落地步骤

  • 先装组件并确认 SHOW VARIABLES LIKE 'validate_password%' 有输出,参数才真正生效
  • 把策略写进 my.cnf 而不是只 SET GLOBAL,否则重启或主从切换后回到默认档位
  • 老账号批量执行 ALTER USER ... PASSWORD EXPIRE 强制改密,逐个通知到责任人
  • 改密窗口与监控口径对齐:锁定事件要能在监控里看到,避免被当成登录异常噪声

易错点

  • 只调 policy 不复核存量账号:老弱口令继续可用,等于策略只对新账号生效
  • dictionary_file 指向不存在的路径:参数设置失败但不影响启动,实际等于没生效,需回看 error log
  • 账号锁定次数小于连接池重试次数:一次抖动触发连续失败就把业务账号锁死,恢复要靠 DBA 手工解锁
  • 绕过组件直接 UPDATE mysql.user 改密:8.0 下既不可靠又绕过强度校验,应统一用 ALTER USER 或 SET PASSWORD

数据来源与参考

  • MySQL 8.0 Reference Manual: Password Validation Component

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌