认证插件与连接安全
本教程共 46 篇 · 第 4 篇 · 更新于 2026-07-30 · 约 12 分钟阅读
4. 认证插件与连接安全
本节目标:搞懂 MySQL 登录时密码是怎么被验证的,认识 caching_sha2_password 和 mysql_native_password 两个核心认证插件的版本演进,学会修改密码、切换认证方式,并了解 SSL/TLS 加密连接。
上一节我们敲 mysql -u root -p 连上了服务器。但你有没有想过,输入的密码是怎么被验证的?为什么有的老客户端连不上 8.0+ 的 MySQL?这一节就揭开认证机制这层纱。
4.1 什么是认证插件
你连 MySQL 时输的密码,并不是直接拿明文和数据库里存的密码比对。MySQL 用的是**认证插件(Authentication Plugin)**机制:
- 服务器端给每个账户配一个认证插件;
- 客户端连接时,插件负责”加工”密码、和服务器握手验证;
- 不同的插件,加密算法、握手流程都不一样。
简单说,认证插件决定了密码怎么存、怎么验、连接怎么握手。它直接关系到”能不能连上”和”连接安不安全”。
4.2 caching_sha2_password:当前默认
从 MySQL 8.0 起,默认认证插件从老的 mysql_native_password 换成了 caching_sha2_password。到 26.7 版本,它依然是默认。
它的特点:
- 用 SHA-256 哈希算法加密密码,比老算法安全得多;
- 支持密码缓存,第二次连接同一账号更快(所以名字里有 “caching”);
- 支持 RSA 公钥加密传输密码,防止被窃听;
- 默认要求 SSL/TLS 加密通道,或用 RSA 传密码。
新建账号默认就用它:
-- 创建一个新账号,默认认证插件就是 caching_sha2_password
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'MyPass123!';
查看某个账号用的什么认证插件:
SELECT user, host, plugin
FROM mysql.user
WHERE user = 'appuser';
输出里 plugin 列显示 caching_sha2_password 就是它。
4.3 mysql_native_password:已被移除
这是 MySQL 用了十几年的老牌认证插件,简单直接:密码用一次哈希(SHA1)就存下来,握手也简单。
它的命运是这样的:
- 8.0 之前:默认插件,几乎所有账号都用它;
- 8.0 起:默认换成 caching_sha2_password,但 mysql_native_password 还能用;
- 8.4 起:被标记为弃用(deprecated),默认不再启用,要用得加启动参数
--mysql-native-password=ON; - 9.0 起:彻底移除(removed),再也不能用了。
Warning本教程基线是 26.7,mysql_native_password 在这个版本里已经不存在。如果你看到老教程教你怎么把这个插件设回去,那是过时的做法。26.7 里只能用 caching_sha2_password、sha256_password 这类安全插件。
4.4 为什么老客户端连不上 8.0+
这是新手最常遇到的”坑”。现象是:用老版本的 mysql 客户端(5.7 及更早)、或者某些老驱动连 8.0+ 的 MySQL,报错:
ERROR 2059 (HY000): Authentication plugin
'caching_sha2_password' cannot be loaded
原因就是老客户端不认识 caching_sha2_password 这个新插件。
正确的解决办法有两个:
- 升级客户端:把 mysql 客户端、JDBC 驱动、ORM 库升级到支持 caching_sha2_password 的版本(8.0+ 的驱动都支持)。这是推荐做法;
- 降级账号认证方式:把账号改回老插件—但这在 26.7 里已经做不到(插件被移除),所以这条只在 8.0~8.3 还能用:
-- 仅 8.0~8.3 可用,26.7 会报错说插件不存在
ALTER USER 'appuser'@'localhost'
IDENTIFIED WITH mysql_native_password BY 'MyPass123!';
Tip我之前接手过一个老 PHP 项目,连不上 8.0 数据库,折腾半天发现是 mysqli 扩展太老。升级 PHP 的 mysql 扩展后就好了。遇到这类错,先查客户端/驱动版本,别急着改服务器。
4.5 修改密码的几种方式
改密码是日常操作,下面几种都常用。
方式一:ALTER USER(推荐)
最标准、最推荐的方式,所有版本通用:
-- 给当前登录用户改密码
ALTER USER USER() IDENTIFIED BY 'NewPass456!';
-- 给指定用户改密码
ALTER USER 'appuser'@'localhost' IDENTIFIED BY 'NewPass456!';
方式二:SET PASSWORD
效果和 ALTER USER 一样,语法更短:
SET PASSWORD = 'NewPass456!';
SET PASSWORD FOR 'appuser'@'localhost' = 'NewPass456!';
方式三:mysqladmin 命令行
在操作系统命令行(不是 mysql 里)执行,适合脚本:
mysqladmin -u root -p password "NewPass456!"
会先让你输旧密码,再设新密码。
NoteMySQL 8.0+ 对密码强度有要求(由
validate_password组件控制)。默认要求至少 8 位、含大小写字母、数字和特殊符号。设太简单的密码会报错。密码策略后面用户管理章会细讲。
4.6 查看和设置默认认证插件
服务器当前的默认认证插件,用这条命令查:
SHOW VARIABLES LIKE 'default_authentication_plugin';
8.0~8.3 输出是 caching_sha2_password。
Warning从 MySQL 8.4 起,
default_authentication_plugin这个系统变量被弃用,改用authentication_policy系列变量。26.7 里建议用新变量。日常用默认值就行,一般不用改。
4.7 连接安全:SSL/TLS 加密
默认的 MySQL 连接是明文传输的—你的 SQL 语句、查询结果在网络上裸奔。本机学习无所谓,但生产环境跨网络连接,必须加密。
MySQL 内置支持 SSL/TLS,能在客户端和服务端之间建立加密通道。开启后,即使有人抓包,也看不到密码和数据。
查看服务器是否开启了 SSL:
SHOW VARIABLES LIKE '%ssl%';
重点看 have_ssl,如果是 YES 表示已启用。
连接时强制要求加密:
mysql -u root -p --ssl-mode=REQUIRED
--ssl-mode 有几个档:
DISABLED:不用 SSL;PREFERRED:能用就用,不能就不加密(默认);REQUIRED:必须加密,否则拒绝连接;VERIFY_CA:加密且验证服务器证书;VERIFY_IDENTITY:加密且验证证书主机名。
Tip本机学习不用管 SSL。但一旦数据库和应用不在同一台机器、走的是公网或公司内网,至少要
--ssl-mode=REQUIRED。
4.8 caching_sha2_password 的两种传输模式
caching_sha2_password 验证密码有两种路径,理解了能解释一些怪现象:
- 快速路径(缓存命中):同一个账号第二次连,服务器缓存了它的哈希,直接比对,不需要传密码原文,速度快;
- 慢速路径(首次连接或缓存失效):第一次连、或服务器重启后缓存没了,客户端要把密码用 RSA 公钥加密后传给服务器。RSA 公钥要么走安全通道拿,要么客户端用
--server-public-key-path指定。
这就是为什么 caching_sha2_password 强烈建议配 SSL—SSL 通道能安全地传 RSA 公钥和密码。
-- 不开 SSL 时,首次连接可能需要允许获取公钥
mysql -u appuser -p --get-server-public-key
4.9 一个完整的账号管理示例
把前面学的串起来,看一个真实场景:
-- 1. 创建账号,默认 caching_sha2_password
CREATE USER 'shop_app'@'%' IDENTIFIED BY 'Shop@Pass2026';
-- 2. 查看认证插件
SELECT user, host, plugin FROM mysql.user WHERE user='shop_app';
-- 3. 改密码
ALTER USER 'shop_app'@'%' IDENTIFIED BY 'NewShop@Pass2026';
-- 4. 锁定/解锁账号(8.0+ 支持)
ALTER USER 'shop_app'@'%' ACCOUNT LOCK; -- 锁定,禁止登录
ALTER USER 'shop_app'@'%' ACCOUNT UNLOCK; -- 解锁
-- 5. 设置密码过期,强制下次登录改密
ALTER USER 'shop_app'@'%' PASSWORD EXPIRE;
Note
'shop_app'@'%'里的%表示允许从任意主机连接。'shop_app'@'localhost'则只允许本机。%范围太大,生产环境建议限制成具体 IP 段。
4.10 小结
这一节理清了 MySQL 认证的核心:
- 认证插件决定密码怎么存、怎么验、怎么握手;
- 8.0+ 默认用
caching_sha2_password,SHA-256 加密、支持缓存; mysql_native_password在 8.4 弃用、9.0 移除,26.7 已不可用;- 老客户端连不上 8.0+ 多半是不认新插件,升级客户端是正解;
- 改密码用
ALTER USER ... IDENTIFIED BY; - 生产环境跨网络连接要开 SSL/TLS 加密。
认证搞清楚了,连接就稳了。下一节我们正式认识 SQL 语句的五大分类,开始系统学语法。