当前位置: 首页 > news >正文

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 CLI8.0+
PythonPyMySQL >= 0.10, mysql-connector-python
PHPPHP 7.4+ with mysqlnd
JavaConnector/J 8.0+
Navicat12.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 部署等),可以告诉我,我可以给出针对性的解决方案。

http://www.dtcms.com/a/494720.html

相关文章:

  • 13.继承(一)
  • vue3:el-progress的圆形无线滚动,心跳、呼吸效果,加载中的效果
  • 高速光耦:电子系统的卓越赋能者
  • 鸿蒙HAP文件数字签名提取与解析
  • 《宋代水墨国漫3D:动态镜头笔触连贯的开发拆解》
  • Fast-Agent:重新定义AI Agent开发的“快“与“简“
  • 做电力的系统集成公司网站个人简历在线制作免费
  • 如何查网站是那家做的用什么做视频网站比较好的
  • SQL UPDATE 语句详解
  • 一个基于BiTCN-BiLSTM混合神经网络的时间序列预测MATLAB程序
  • Python开发的自我修养之数据类型的选择策略
  • Day02_刷题niuke20251017
  • [嵌入式系统-135]:主流AIOT智能体开发板
  • 设计模式---观察者模式
  • 【软考备考】 高并发场景如何做负载均衡知识点四
  • LOFAR物理频谱特征提取及实现
  • excel拼接数据库
  • 23ICPC杭州vp补题
  • 做网站不难吧长兴网站建设
  • Kafka、ActiveMQ、RabbitMQ、RocketMQ 对比
  • Unity中UI背景的高斯模糊
  • Avalonia 的命令基类和通知基类备份
  • 分布式和微服务的区别是什么?
  • windows10 安装 WSL2 及 ubuntu 24.04,Ubuntu中安装CUDA
  • 全链路智能运维中的多模态数据融合与语义对齐技术
  • 【DevOps】基于Nexus部署内网pypi代理镜像仓库操作手册
  • 微服务核心
  • 网站倒计时如何做自己的影视网站
  • 【DevOps】基于Nexus部署内网ubuntu 2204系统APT代理镜像仓库操作手册
  • 【开题答辩实录分享】以《开题报告 智能家居控制平台的构建》为例进行答辩实录分享