MySQL 8.0.19起原生支持密码复用策略,需同时配置password_history和password_reuse_interval参数并启用caching_sha2_password插件,且仅ALTER USER...IDENTIFIED BY操作触发校验。

MySQL 8.0 原生不支持密码复用策略(如禁止重用最近 N 个密码),必须结合 password_history 和 password_reuse_interval 两个参数 + 持久化配置才能满足等保三级要求。 单独设 default_password_lifetime 或只开 validate_password 组件,完全无法拦截历史密码重用。
确认 MySQL 版本与密码管理功能可用性
等保三级明确要求“禁止密码重复使用”,但该能力在 MySQL 8.0.19 才正式引入。低于此版本(如 8.0.16、8.0.18)即使配置了相关变量,ALTER USER ... IDENTIFIED BY 也不会校验历史密码,形同虚设。
- 执行
SELECT VERSION();确认版本 ≥8.0.19 - 检查变量是否可写:
SHOW VARIABLES LIKE 'password_%';—— 若无password_history或password_reuse_interval输出,说明版本过低或未启用新认证框架 - 注意:该功能依赖
caching_sha2_password认证插件,若用户仍用mysql_native_password,密码哈希不存历史记录,策略自动失效
设置 password_history 和 password_reuse_interval 参数
这两个参数必须同时生效才构成完整复用控制:前者限制最多保留几个旧密码哈希,后者限制多少天内不可重用同一密码。等保三级通常要求“近 5 个密码不可重用”且“180 天内不可重用”,但具体数值需按单位安全策略定。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 在线设置(仅当前实例有效):
SET PERSIST password_history = 5;SET PERSIST password_reuse_interval = 180; - 必须用
SET PERSIST(而非SET GLOBAL),否则重启后丢失;SET PERSIST会写入mysqld-auto.cnf,优先级高于 my.cnf - 若已存在
mysqld-auto.cnf且权限受限,改写失败,需手动追加到/etc/my.cnf的[mysqld]段:password_history = 5password_reuse_interval = 180 - 验证是否加载:
SELECT @@password_history, @@password_reuse_interval;—— 返回值应与设定一致
强制用户切换认证方式以激活历史记录存储
密码复用策略只对使用 caching_sha2_password 插件的用户生效。MySQL 8.0 默认新用户用此插件,但升级上来的老用户可能仍是 mysql_native_password,其密码哈希不进 mysql.user 表的 password_last_changed 和历史字段,导致策略静默失效。
- 查当前用户认证方式:
SELECT user, host, plugin FROM mysql.user; - 批量切换(推荐):
ALTER USER 'u'@'h' IDENTIFIED WITH caching_sha2_password BY 'current_password'; - 不能用
SET PASSWORD或直接更新mysql.user表 —— 这样不会触发历史密码写入逻辑 - 切换后首次
ALTER USER ... IDENTIFIED BY才开始记录第一条历史密码;之前所有密码都不计入password_history计数
实测验证复用拦截是否真实触发
很多人配完就以为 OK,但实际中常见“配置写了、变量看了、版本也对,就是不报错”。根本原因是没走对触发路径 —— 只有通过 ALTER USER ... IDENTIFIED BY 显式修改密码时才会校验,而 SET PASSWORD、复制同步、主从初始化等场景均跳过。
- 先重置一次密码让系统建立首条历史记录:
ALTER USER 'test'@'localhost' IDENTIFIED BY 'Pass@2026!'; - 立即再试重用:
ALTER USER 'test'@'localhost' IDENTIFIED BY 'Pass@2026!';→ 必须报ERROR 3952 (HY000):“The password cannot be the same as any of the last 5 passwords” - 若没报错,检查:
– 是否用了SET PASSWORD而非ALTER USER ... IDENTIFIED BY
– 用户plugin是否仍是mysql_native_password
–SELECT * FROM mysql.password_history WHERE user = 'test' AND host = 'localhost';是否有记录
真正容易被忽略的是:密码历史只存哈希,不存明文,所以无法跨实例共享;如果业务用主从架构,必须在每个节点单独配置并确保用户认证方式统一,否则从库可能放行已被主库拒绝的复用密码。

















