mysql8.0.x中登录认证支持哪些插件
在 MySQL 8.0 中,mysql.user 表的 plugin 字段用于指定用户认证时使用的认证插件。认证插件决定了用户密码的存储方式以及客户端连接时如何验证身份。
MySQL 8.0 支持多种认证插件
1. mysql_native_password
- 含义:这是 MySQL 5.x 及更早版本使用的传统认证插件,也是 MySQL 8.0 的向后兼容选项。
- 密码存储方式:使用 SHA1 算法对密码进行单向哈希,存储为 41 字节的哈希值(以
*开头)。 - 特点:
- 简单、兼容性强,适用于老版本客户端。
- 安全性较低(相对于新插件),因为仅使用 SHA1 且无额外的盐值或挑战-响应机制。
- 使用场景:需要与旧版 MySQL 客户端或不支持新插件的应用程序兼容时使用。
2. caching_sha2_password(MySQL 8.0 默认)
- 含义:MySQL 8.0 引入的默认认证插件,提供更高的安全性。
- 密码存储方式:使用 SHA-256 算法对密码进行哈希,并结合挑战-响应机制。
- 特点:
- 支持缓存机制,首次认证后后续连接可跳过完整哈希计算,提升性能。
- 需要加密连接(TLS/SSL)或客户端支持挑战-响应协议,否则会回退到明文传输(不安全)。
- 比
mysql_native_password更安全,抗暴力破解能力更强。
- 使用场景:推荐用于新安装的 MySQL 8.0 系统,尤其是需要高安全性的环境。
3. sha256_password
- 含义:MySQL 5.6 引入的认证插件,使用 SHA-256 哈希,MySQL 8.0 继续支持。
- 密码存储方式:密码以 SHA-256 哈希形式存储。
- 特点:
- 要求加密连接(TLS/SSL),否则无法使用(不会回退到明文)。
- 不支持缓存,性能略低于
caching_sha2_password。 - 安全性较高,但使用场景较少。
- 使用场景:需要 SHA-256 哈希但不依赖缓存的环境。
4. mysql_old_password
- 含义:非常老旧的认证插件,来自 MySQL 4.0 及更早版本,仅为向后兼容保留。
- 密码存储方式:使用早期的弱哈希算法,生成 16 字节的哈希值。
- 特点:
- 安全性极低(算法过时,容易被破解)。
- MySQL 8.0 默认禁用此插件,除非手动编译启用。
- 使用场景:几乎不用,仅在极端情况下需要兼容非常老旧的系统。
5. auth_socket(或 unix_socket)
- 含义:基于 UNIX 套接字的认证插件,仅适用于本地连接。
- 密码存储方式:不依赖密码,而是通过操作系统用户身份验证。
- 特点:
- 无需输入密码,MySQL 检查连接的 UNIX 用户是否与
mysql.user表中的用户名匹配。 - 只适用于本地连接(通过
/var/run/mysqld/mysqld.sock)。 - 安全性依赖于操作系统用户权限。
- 无需输入密码,MySQL 检查连接的 UNIX 用户是否与
- 使用场景:本地 root 用户或其他特定用户的安全访问,例如
root@localhost。
6. pam(Pluggable Authentication Module)
- 含义:通过 Linux/Unix 的 PAM 系统进行认证。
- 密码存储方式:不直接存储密码,依赖外部 PAM 配置(如
/etc/pam.d/mysql)。 - 特点:
- 支持操作系统用户认证、LDAP 或其他 PAM 支持的机制。
- 需要额外配置 PAM 服务。
- 只适用于支持 PAM 的系统(如 Linux)。
- 使用场景:需要与操作系统或其他外部认证系统集成的场景。
7. ed25519
- 含义:基于 Ed25519 椭圆曲线签名算法的认证插件。
- 密码存储方式:使用公钥加密机制,密码不以传统哈希存储。
- 特点:
- 高安全性,依赖非对称加密。
- 需要客户端支持此插件。
- 配置复杂,使用较少。
- 使用场景:高级用户需要基于公钥认证的场景。
8. 其他第三方插件
MySQL 支持扩展认证插件,开发者可以编写自定义插件并加载到系统中。例如:
- LDAP 认证插件(企业版功能):用于集成企业级 LDAP 或 Active Directory。
- Kerberos 认证插件(企业版):用于支持 Kerberos 认证。
这些插件通常需要 MySQL 企业版或手动编译支持。
9.如何查看当前支持的插件?
你可以通过以下 SQL 命令查看 MySQL 8.0 实例支持的认证插件:
1 | SHOW PLUGINS; |
或者查询 information_schema.plugins 表:
1 | SELECT PLUGIN_NAME, PLUGIN_STATUS FROM information_schema.PLUGINS WHERE PLUGIN_TYPE = 'AUTHENTICATION'; |
激活状态插件
10.mysql.user 表中的 plugin 字段
在 mysql.user 表中,plugin 列存储每个用户使用的认证插件。例如:
1 | SELECT user, host, plugin FROM mysql.user; |
输出可能如下:
+------+-----------+-----------------------+
| user | host | plugin |
+------+-----------+-----------------------+
| root | localhost | caching_sha2_password |
| user1| % | mysql_native_password |
+------+-----------+-----------------------+
查看当前mysql默认认证插件
1.查看表结构
show create table mysql.user;
...
`plugin` char(64) COLLATE utf8mb3_bin NOT NULL DEFAULT 'caching_sha2_password',
describe mysql.user;
2.查看已存在账户认证形式
mysql> select user,host,plugin,password_last_changed from mysql.user;
+------------------+-----------+-----------------------+-----------------------+
| user | host | plugin | password_last_changed |
+------------------+-----------+-----------------------+-----------------------+
| debian-sys-maint | localhost | caching_sha2_password | 2025-03-07 09:14:47 |
| mysql.infoschema | localhost | caching_sha2_password | 2025-03-07 09:14:46 |
| mysql.session | localhost | caching_sha2_password | 2025-03-07 09:14:46 |
| mysql.sys | localhost | caching_sha2_password | 2025-03-07 09:14:46 |
| root | localhost | auth_socket | 2025-03-07 09:14:45 |
+------------------+-----------+-----------------------+-----------------------+
11.如何更改用户的认证插件?
可以使用 ALTER USER 语句修改用户的认证插件,例如:
- 将用户改为
mysql_native_password:1
ALTER USER 'user1'@'%' IDENTIFIED WITH 'mysql_native_password' BY 'newpassword';
- 将用户改为
caching_sha2_password:1
ALTER USER 'user1'@'%' IDENTIFIED WITH 'caching_sha2_password' BY 'newpassword';
总结
MySQL 8.0 支持的常见认证插件及其用途:
- **
mysql_native_password**:传统、兼容性好但安全性较低。 - **
caching_sha2_password**:默认、高安全性、推荐使用。 - **
sha256_password**:高安全但无缓存。 - **
auth_socket**:本地无密码认证。 - **
pam**:集成操作系统认证。 - **
ed25519**:基于公钥的高级认证。