本文主要是介绍8.0 新特性 - Caching SHA-2 Pluggable Authentication,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 前言
- 1. mysql_native_password 介绍
- 2. caching_sha2_password 介绍
- 3. 常见问题
- 3.1 连接报错
- 3.2 复制配置
- 3.3 组复制配置
- 后记
前言
升级到 MySQL 8.0 后,可能会遇到如下报错,常发生在连接 MySQL 或配置复制关系的时候。
ERROR 2061 (HY000): Authentication plugin ‘caching_sha2_password’ reported error: Authentication requires secure connection.
网络上通常建议的解决方案是将 default_authentication_plugin 修改为 mysql_native_password 来解决。虽然可以规避报错,但是在 MySQL 8.1 版本 mysql_native_password 旧插件将被废弃,到时还是要直面 caching_sha2_password 插件。本篇文章将详细解读新的认证插件。
MySQL 8.1 发行说明:The mysql_native_password authentication plugin now is deprecated and subject to removal in a future version of MySQL. CREATE USER, ALTER USER, and SET PASSWORD operations now insert a deprecation warning into the server error log if an account attempts to authenticate using mysql_native_password as an authentication method.
1. mysql_native_password 介绍
mysql_native_password 是 MySQL 5.6 和 5.7 版本默认的认证插件,其优点是速度快支持 challenge-response 机制,无需在网路上发送实际的密码,并且不需要加密连接。
服务端使用 OpenSSL 库中的函数对输入的密码进行 SHA-1 哈希,生成 hash_stage1,再将生成的 hash_stage1 进行二次 SHA-1 哈希,生成 hash_stage2,然后再将 hash_stage2 转换为 16 进制。最后生成的字符串就是我们在 mysql.user 中看到的authentication_string 字段。
其加密过程使用 Python 实现的代码如下。
import hashlibdef compute_sha1_hash(data):sha1 = hashlib.sha1()sha1.update(data)return sha1.digest()password = "abc123".encode('utf-8')
hash_stage1 = compute_sha1_hash(password)
hash_stage2 = compute_sha1_hash(hash_stage1)print('*%s'%hash_stage2.hex().upper())
随着技术发展,mysql_native_password 被验证不再安全,原因如下:
- SHA-1 自身不再安全,这主要是指 SHA-1 存在碰撞漏洞,即两个不同的输入可以产生相同的哈希值。
- 因为相同的密码 authentication_string 的字段值是一样的,容易引起彩虹表攻击,密码可能会被破解。
2. caching_sha2_password 介绍
刚才介绍了 mysql_native_password 插件不再安全,容易被破解。从 MySQL 8.0.4 版本开始,默认用户认证插件由 mysql_native_password 更改为 caching_sha2_password 提供了更强的安全性。
caching_sha2_password 底层使用的加密算法(SHA-256)早在 sha256_password 这个认证插件( MySQL 5.6 中引入的)中就使用了。虽然 sha256_password 足够安全,但是由于它要求使用安全连接或使用 RSA 密钥对进行密码交换的未加密连接,因此其身份验证的效率较低。caching_sha2_password 在 sha256_password 的基础上,新增了一个内存缓存,用于存储哈希密码,以加快认证速度。
caching_sha2_password 对密码安全性要求更高,要求用户认证过程中在网络传输的密码是加密的:
- 如果是 SSL 加密连接,则使用 SSL 证书和密钥对来完成 “对称加密密钥对(在TSL握手中生成)” 的交换,后续使用“对称加密密钥对” 加密密码和数据。
- 如果是非 SSL 加密连接,则在连接建立时客户端使用 MySQL Server 端的 RSA 公钥加密用户密码,Server 端使用 RSA 私钥解密验证密码的正确性,可以防止密码在网络传输时被窥探。
RSA 使用的公钥和私钥,默认存储在 datadir 目录下:
private_key.pem RSA公钥
public_key.pem RSA私钥
3. 常见问题
3.1 连接报错
如果使用 caching_sha2_password 认证方式,MySQL 会要求连接开启 SSL,或者使用 RSA 对密码进行加密,否则连接可能会报如下的错误:
mysql -u user3 -pabc123 -h127.0.0.1 --ssl-mode=DISABLED
ERROR 2061 (HY000): Authentication plugin ‘caching_sha2_password’ reported error: Authentication requires secure connection.
MySQL 客户端可以通过命令行参数 server-public-key-path 指定有效的 RSA Public Key 路径:
mysql -u user3 -pabc123 -h127.0.0.1 --ssl-mode=DISABLED --server-public-key-path=/data/mysql/data/public_key.pem
如果本地没有 RSA public key,可以在登录时从服务端下载 Public Key。相比上一个方法,这种方法不需要在客户端本地维护public key 文件,使用更加简单。但是在登录阶段,需要从服务端下载 public key,会增加第一次验证下载的耗时。
3.2 复制配置
配置复制关系时,如果复制用户也是使用 caching_sha2_password 插件,那么需要配置公钥。
CHANGE REPLICATION SOURCE TO SOURCE_PUBLIC_KEY_PATH = 'key_file_name'
或者配置该参数,自动获取公钥,无需额外配置。
CHANGE REPLICATION SOURCE TO GET_SOURCE_PUBLIC_KEY = {0|1}
3.3 组复制配置
对于 MGR ,如果设置 group_replication_ssl_mode=DISABLED ,则也必须使用下面的变量来指定 RSA 公钥,否则报错:
- group_replication_recovery_get_public_key :向服务端请求 RSA 公钥;
- group_replication_recovery_public_key_path :指定本地 RSA 公钥文件。
两个参数,配置其中一个即可,考虑到拷贝 RSA 公钥到各节点麻烦,建议设置 group_replication_recovery_get_public_key=ON 。
后记
- https://dev.mysql.com/doc/refman/8.0/en/caching-sha2-pluggable-authentication.html
- https://dev.mysql.com/blog-archive/mysql-8-0-4-new-default-authentication-plugin-caching_sha2_password
这篇关于8.0 新特性 - Caching SHA-2 Pluggable Authentication的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!