首页 / MySQL 入门教程 / 认证插件与连接安全

MySQL 入门教程

认证插件与连接安全

本教程共 46 篇 · 第 4 篇 · 更新于 2026-07-30 · 约 12 分钟阅读

MySQLMySQL 入门教程认证插件caching_sha2_password密码SSL连接安全

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 这个新插件。

正确的解决办法有两个:

  1. 升级客户端:把 mysql 客户端、JDBC 驱动、ORM 库升级到支持 caching_sha2_password 的版本(8.0+ 的驱动都支持)。这是推荐做法;
  2. 降级账号认证方式:把账号改回老插件—但这在 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!"

会先让你输旧密码,再设新密码。

Note

MySQL 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 验证密码有两种路径,理解了能解释一些怪现象:

  1. 快速路径(缓存命中):同一个账号第二次连,服务器缓存了它的哈希,直接比对,不需要传密码原文,速度快;
  2. 慢速路径(首次连接或缓存失效):第一次连、或服务器重启后缓存没了,客户端要把密码用 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 语句的五大分类,开始系统学语法。