caching_sha2_password认证插件说明
🔍 一、核心结论(先看重点)
✅ 从 MySQL 8.0 开始,
caching_sha2_password
成为默认的用户密码认证方式,取代了旧的mysql_native_password
。
它更安全、性能更好,但可能导致老客户端连接失败,需要升级客户端或调整配置。
🧩 二、为什么要有这个变化?
1. 旧认证方式的问题:mysql_native_password
- 使用较弱的哈希算法(SHA1 基础的 scramble)。
- 不支持现代加密传输。
- 在 MySQL 8.0.34 被标记为“已弃用”(deprecated)。
2. 新认证方式的优势:caching_sha2_password
特性 | 说明 |
---|---|
🔐 更安全 | 使用 SHA-256 加密密码(比 SHA1 强得多) |
⚡ 更快 | 服务器缓存用户认证信息,重复登录更快 |
🔄 支持非加密连接的安全认证 | 即使不启用 SSL/TLS,也能通过 RSA 公钥加密传输密码 |
📦 内建支持 | 不依赖 OpenSSL,自带 RSA 功能 |
🛠️ 三、caching_sha2_password
是怎么工作的?
1. 用户登录流程(简化版)
客户端连接 → 服务端检查是否使用 caching_sha2_password → ↓
如果是:检查连接是否安全(SSL/TLS 或本地 socket)?→ 是:直接明文传密码(安全通道内,不怕窃听)→ 否:必须使用 RSA 加密密码再发送
⚠️ 注意:“明文”只是指没有加密,但由于连接本身是加密的(如 TLS),所以不危险。
2. RSA 密码交换机制(用于非加密连接)
当你的连接不是 SSL 加密时(比如普通 TCP),MySQL 会要求用 RSA 加密密码:
- 服务端生成一对 RSA 密钥(
private_key.pem
,public_key.pem
) - 客户端获取公钥(两种方式):
- 方式一:本地存一份公钥文件(推荐,更安全)
- 方式二:连接时向服务器请求公钥(方便,但可能被中间人攻击)
# 示例:使用本地公钥连接
mysql -u myuser -p --server-public-key-path=/path/to/public_key.pem# 或者让客户端自动向服务器要公钥
mysql -u myuser -p --get-server-public-key
如果既没提供公钥,也没开启 SSL,就会报错:
ERROR 2061: Authentication requires secure connection.
3. 缓存机制(Cache)——提升性能的关键
- 服务器内存中维护一个“用户名 + 密码哈希”的缓存表。
- 第一次登录:查
mysql.user
表验证,成功后加入缓存。 - 第二次登录:直接比对缓存,速度快很多。
缓存在什么时候清空?
操作 | 是否清空缓存 |
---|---|
FLUSH PRIVILEGES | ✅ 清空全部缓存 |
修改密码 / 修改插件 | ✅ 清空该用户缓存 |
删除或重命名用户 | ✅ 清空对应缓存 |
重启 MySQL | ✅ 缓存消失(不持久化) |
清空后,下次登录必须走“安全连接”或“RSA加密”,否则失败。
🧰 四、如何配置和使用?
1. 创建使用 caching_sha2_password
的用户
-- 显式指定插件
CREATE USER 'sha2user'@'localhost'
IDENTIFIED WITH caching_sha2_password BY 'password';-- 如果默认插件已是 caching_sha2_password,可省略
CREATE USER 'sha2user'@'localhost' IDENTIFIED BY 'password';
2. 设置为全局默认认证方式(MySQL 配置文件)
[mysqld]
default_authentication_plugin=caching_sha2_password
⚠️ 修改后只对新创建的用户生效,不影响已有用户。
3. 让老用户也切换到新认证方式
ALTER USER 'olduser'@'%'
IDENTIFIED WITH caching_sha2_password BY 'password';
4. 检查当前用户的认证方式
SELECT user, host, plugin FROM mysql.user;
输出示例:
+----------+-----------+-----------------------+
| user | host | plugin |
+----------+-----------+-----------------------+
| root | localhost | caching_sha2_password |
| appuser | % | mysql_native_password |
+----------+-----------+-----------------------+
🔄 五、兼容性问题与解决方案
❌ 常见问题:老客户端无法连接
例如:
- PHP < 7.4 + mysqlnd
- Python MySQLdb / old PyMySQL
- Java Connector/J < 8.0
- Navicat 旧版本
- 命令行工具未加
--get-server-public-key
错误提示:
Authentication plugin 'caching_sha2_password' cannot be loaded
✅ 解决方案(任选其一)
✅ 方案 1:升级客户端驱动
确保使用支持 caching_sha2_password
的新版客户端库。
语言/工具 | 推荐版本 |
---|---|
MySQL CLI | 8.0+ |
Python | PyMySQL >= 0.10, mysql-connector-python |
PHP | PHP 7.4+ with mysqlnd |
Java | Connector/J 8.0+ |
Navicat | 12.1+ |
✅ 方案 2:创建用户时强制使用旧认证方式(临时方案)
CREATE USER 'compat_user'@'%'
IDENTIFIED WITH mysql_native_password BY 'password';
⚠️ 不推荐长期使用,安全性较低。
✅ 方案 3:修改全局默认插件(不推荐)
在 my.cnf
中改回旧方式:
[mysqld]
default_authentication_plugin=mysql_native_password
❌ 这样做会失去新版本的安全优势,仅用于过渡。
🧪 六、验证 RSA 公钥是否生效
连接到 MySQL 执行:
SHOW STATUS LIKE 'Caching_sha2_password_rsa_public_key';
如果返回的是类似下面的内容,说明 RSA 已启用:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDO9nRUDd+KvSZgY...
-----END PUBLIC KEY-----
如果是空值,说明密钥文件有问题,请检查日志。
📚 七、术语解释(帮助理解文档)
术语 | 含义 |
---|---|
caching_sha2_password | 新的默认认证插件,基于 SHA-256,带缓存优化 |
sha256_password | 老的 SHA-256 插件,无缓存,已废弃 |
mysql_native_password | 旧认证方式,弱加密,已被弃用 |
RSA key pair | 用于在非加密连接上传输密码的公私钥 |
--get-server-public-key | 客户端选项,表示“向服务器要公钥” |
--server-public-key-path | 客户端选项,指定本地公钥文件路径 |
🧩 八、最佳实践建议
场景 | 推荐做法 |
---|---|
新项目 | 使用 caching_sha2_password ,开启 SSL |
老系统迁移 | 逐步将用户改为新认证方式 |
安全要求高 | 使用本地公钥 + SSL |
开发测试环境 | 可使用 --get-server-public-key 简化配置 |
自动化脚本 | 提供 --server-public-key-path 避免交互 |
✅ 总结:一句话理解
caching_sha2_password
是 MySQL 8.0 的默认登录验证方式,它用 SHA-256 加密密码、用缓存加快登录速度,并支持通过 RSA 在普通网络上传输密码。但它要求客户端支持新协议,否则会连接失败——解决方法是升级客户端或启用 RSA 公钥认证。
如果你有具体的使用场景(比如 PHP 连接失败、Navicat 报错、Docker 部署等),可以告诉我,我可以给出针对性的解决方案。