caching_sha2_password安全性更高,因其采用pbkdf2-sha256(随机salt+5000次迭代)替代mysql_native_password的无盐无迭代sha1(sha1(password)),强制tls或rsa加密传输,并引入内存缓存提升短连接性能。

因为 mysql_native_password 用的 SHA1 已被 NIST 明确要求淘汰,存在哈希碰撞、明文协商、无强制加密通道等实际可利用风险;caching_sha2_password 是 MySQL 团队在安全水位升级前提下给出的务实解法。
SHA1 算法本身已被攻破,不是“理论上不安全”
mysql_native_password 存储的是 SHA1(SHA1(password)),两个用户设相同密码,authentication_string 字段值就完全一样——这等于把密码一致性直接暴露在 mysql.user 表里。实验室级 SHA1 碰撞攻击早已可行,NIST 要求 2026 年起全面停用 SHA1 相关实现。
常见错误现象:2059 - authentication plugin 'caching_sha2_password' cannot be loaded 或客户端直接拒绝握手,其实不是插件“有问题”,而是旧客户端还在尝试走 SHA1 协议路径。
caching_sha2_password 不只是换了个哈希函数
它强制要求 TLS 加密通道,或通过 RSA 公钥加密传输凭证(非 SSL 连接时);每次认证都带随机盐值 + 固定 5000 轮 SHA256 迭代,杜绝彩虹表和离线爆破。
性能影响被误读最多:首次连接耗时 ≈ sha256_password,但缓存命中后(默认 TTL 300 秒)连接开销下降 60%~80%,对 PHP-FPM、Serverless 等短连接密集场景反而更优。
注意:mysql_native_password 没有缓存概念,每次连接都重算 SHA1,单次快但无安全纵深。
兼容性问题本质是客户端协议栈没跟上
不是插件“不兼容”,而是老客户端压根没实现 caching_sha2_password 的完整握手流程:
-
Navicat ≤ 12.1默认用旧版libmysqlclient,不支持 RSA 密钥交换 mysql-connector-java 会抛 <code>Unknown system variable 'caching_sha2_password'-
PDO_MySQL和mysqli扩展(截至 2026 年)仍不支持该插件 - Docker 镜像若基于 Ubuntu 20.04,自带 client lib 版本常低于 8.0.28,也会卡住
最容易被忽略的一点:改完服务端 ALTER USER 后,Navicat 不关掉重连、或没删旧连接重建,它可能还在用缓存的旧 handshake 参数死循环重试。
真正复杂的地方不在“怎么切回 mysql_native_password”,而在于你得先确认连的是 'root'@'localhost' 还是 'root'@'127.0.0.1' ——这两个账号在 MySQL 里互不等价,plugin 字段各自独立,漏改一个就白忙。











