最近有不少小伙伴反馈,MySQL 8.4的日志里频繁出现一条警告:
2026-05-08T08:56:49.106554Z 1604 [Warning] [MY-013360] [Server] Plugin sha256_password reported: ''sha256_password' is deprecated and will be removed in a future release. Please use caching_sha2_password instead'
其实这条警告背后,藏着MySQL密码认证插件数十年的迭代逻辑——从早期简单的弱哈希,到如今兼顾安全与性能的现代认证,每一步都在为数据库安全筑牢防线。今天我们就来梳理一下MySQL密码插件的迭代历程。
一、为什么插件要不断迭代?
MySQL密码插件的核心作用,是实现用户密码的加密存储与身份认证。迭代的本质,就是解决三个核心问题:
安全性:抵御暴力破解、彩虹表、中间人攻击等风险
性能:减少认证过程中的计算开销,提升连接效率
兼容性:适配不同版本客户端、不同部署场景的需求
从1995年MySQL诞生至今,插件迭代大致分为4个核心阶段,每一个阶段都对应着当时的安全需求与技术局限。
二、迭代全里程:4个阶段,从“裸奔”到“硬核防护”
1. 史前时代
MySQL4.0及更早的版本,主要在1995至2004年的版本中使用的密码插件是mysql_old_password。这是MySQL最早期的认证方式,堪称“极简但极不安全”,放在现在来看几乎等同于“裸奔”。

核心特征:
采用简单哈希算法,仅生成16字节哈希值
无随机盐值,相同密码生成完全相同的哈希
客户端直接发送明文密码,网络传输易泄露
生命周期:MySQL 5.6弃用,5.7.5完全移除,如今已成为历史。
2.黄金时代
在MySQL 4.1-5.7版本上使用,发行年限是2005至2017年,对应的密码插件是mysql_native_password。这是MySQL使用最久、最经典的认证插件,陪伴了无数开发者十几年,解决了早期的核心安全隐患。
关键改进(2005年MySQL4.1引入):
采用“双SHA-1哈希”(SHA1(SHA1(password))),生成41字节哈希值,抗碰撞能力提升
引入“挑战-响应”机制:服务器发送随机值,客户端计算哈希响应,避免明文传输
兼容4.1+所有版本,成为长期默认标准
局限性:
基于SHA-1算法(2005年后逐渐被认定为不安全),无盐值机制,相同密码仍会生成相同哈希,且无内置加密传输支持,需依赖SSL/TLS。
生命周期:MySQL 8.0.34弃用,MySQL 9.0完全移除,目前部分旧系统仍在使用。
3. 转型时代
在MySQL5.6-8.0版本上,发行版本在2013-2018年,随着网络安全需求升级,MySQL开始引入更强的加密算法,同时丰富插件类型,适配不同场景,sha256_password就是这一阶段的核心产物,此时密码插件多元化时代到来。
核心特征:
采用SHA-256强哈希算法,安全性远超SHA-1
支持随机盐值,相同密码生成不同哈希,抵御彩虹表攻击
强制通过SSL/TLS或RSA加密传输密码,防止中间人攻击
不足:每次认证都需全量计算SHA-256,多轮加密导致性能下降,不适合高并发场景。
同时期补充插件:
auth_socket(Unix系统):通过操作系统套接字认证,无需密码,适合本地管理
auth_pam:集成系统PAM认证,适合企业级复杂环境
mysql_clear_password:仅用于测试,明文传输密码(需安全连接)
4. 现代安全时代
而MySQL 8.0至今,caching_sha2_password变成了主导密码插件。这是目前MySQL官方推荐的“终极方案”,完美解决了“安全与性能”的矛盾,也是我们现在必须迁移的目标插件。
革命性突破(2018年MySQL 8.0.4成为默认插件):
性能拉满:首次认证后缓存结果,后续认证速度提升10倍+,解决sha256_password的性能痛点
安全拉满:继承sha256_password的所有安全特性(SHA-256、盐值、加密传输)
灵活适配:支持SSL/TLS、RSA加密,也可在安全场景下明文传输,兼容主流客户端驱动
🔔 关键提醒:
MySQL8.4已正式弃用sha256_password,日志中频繁出现的警告,就是官方在强制推动迁移;未来MySQL9.x将彻底移除该插件,未迁移的用户将无法登录!

插件名称 | 核心算法 | 安全等级 | 性能 | 当前状态 |
|---|---|---|---|---|
mysql_old_password | 简单哈希 | 极低 | 极高 | 已移除 |
mysql_native_password | SHA-1×2 | 中 | 高 | 已移除(MySQL 9.0) |
sha256_password | SHA-256 | 高 | 中 | 已弃用(MySQL 8.4+) |
caching_sha2_password | SHA-256(带缓存) | 极高 | 极高 | 官方推荐(8.0+) |
三、MySQL8.4用户如何快速迁移插件
如果你正在使用MySQL8.4,且日志中出现sha256_password警告,按以下步骤操作,轻松完成迁移,避免后续无法登录。
1. 查找需迁移的用户
执行以下SQL,查看所有使用低版本密码插件的用户,例如还在使用sha256_password或mysql_native_password的用户:
SELECT user, host, pluginFROM mysql.userWHERE plugin IN ('sha256_password', 'mysql_native_password');

2. 单个用户迁移
针对查询出的用户,逐个迁移到caching_sha2_password,记得替换用户名、主机和密码:
ALTER USER 'username'@'host'IDENTIFIED WITH caching_sha2_password BY 'your_password';

3. 批量迁移(谨慎使用,适合多用户场景)
SET @sql = NULL;SELECT GROUP_CONCAT(CONCAT("ALTER USER '", user, "'@'", host, "' IDENTIFIED WITH caching_sha2_password BY 'your_password';")SEPARATOR ' ') INTO @sqlFROM mysql.userWHERE plugin IN ('sha256_password', 'mysql_native_password');PREPARE stmt FROM @sql;EXECUTE stmt;DEALLOCATE PREPARE stmt;
4. 验证迁移结果
迁移后执行以下SQL,确认无旧插件用户:
SELECT user, host, pluginFROM mysql.userWHERE plugin IN ('sha256_password', 'mysql_native_password');
可见,处理完毕后已经无旧插件用户了

5. 设置全局默认插件
编辑MySQL配置文件(my.cnf/my.ini),添加以下配置,确保新创建的用户默认使用caching_sha2_password:
[mysqld]default_authentication_plugin = caching_sha2_password
重启MySQL服务生效(systemctl restart mysqld)。
6. 客户端兼容性
如果迁移后出现“Authentication method 'caching_sha2_password' not supported”错误,只需升级客户端驱动:
MySQL Connector/J 需升级到8.0+
Python mysql-connector-python 需升级到8.0+
Navicat、DBeaver等工具,升级到最新版本即可适配
四、总结
MySQL密码插件的迭代,本质上是“安全优先、性能跟上、兼容过渡”的过程:从无盐值到加盐,从弱哈希到强哈希,从无缓存到有缓存,每一步都在解决上一代的痛点。
未来,MySQL还会继续强化认证安全:比如引入SHA-3算法、集成OAuth2.0协议,更好地适配云环境、容器化部署等场景。
MySQL8.4+用户,务必尽快迁移sha256_password用户;MySQL 9.0已彻底移除旧插件,未迁移将直接影响业务正常运行。
收藏本文,下次遇到插件警告、迁移问题,直接对照操作即可!
夜雨聆风