8.0 新特性 - Caching SHA-2 Pluggable Authentication

2024-02-18 17:28

本文主要是介绍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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/721896

相关文章

ActiveMQ—消息特性(延迟和定时消息投递)

ActiveMQ消息特性:延迟和定时消息投递(Delay and Schedule Message Delivery) 转自:http://blog.csdn.net/kimmking/article/details/8443872 有时候我们不希望消息马上被broker投递出去,而是想要消息60秒以后发给消费者,或者我们想让消息没隔一定时间投递一次,一共投递指定的次数。。。 类似

PostgreSQL核心功能特性与使用领域及场景分析

PostgreSQL有什么优点? 开源和免费 PostgreSQL是一个开源的数据库管理系统,可以免费使用和修改。这降低了企业的成本,并为开发者提供了一个活跃的社区和丰富的资源。 高度兼容 PostgreSQL支持多种操作系统(如Linux、Windows、macOS等)和编程语言(如C、C++、Java、Python、Ruby等),并提供了多种接口(如JDBC、ODBC、ADO.NET等

详解Tomcat 7的七大新特性和新增功能(1)

http://developer.51cto.com/art/201009/228537.htm http://tomcat.apache.org/tomcat-7.0-doc/index.html  Apache发布首个Tomcat 7版本已经发布了有一段时间了,Tomcat 7引入了许多新功能,并对现有功能进行了增强。很多文章列出了Tomcat 7的新功能,但大多数并没有详细解释它们

如何掌握面向对象编程的四大特性、Lambda 表达式及 I/O 流:全面指南

这里写目录标题 OOP语言的四大特性lambda输入/输出流(I/O流) OOP语言的四大特性 面向对象编程(OOP)是一种编程范式,它通过使用“对象”来组织代码。OOP 的四大特性是封装、继承、多态和抽象。这些特性帮助程序员更好地管理复杂的代码,使程序更易于理解和维护。 类-》实体的抽象类型 实体(属性,行为) -》 ADT(abstract data type) 属性-》成

C# Hash算法之MD5、SHA

MD5我们用的还是比较多的,一般用来加密存储密码。但是现在很多人觉MD5可能不太安全了,所以都用上了SHA256等来做加密(虽然我觉得都差不多,MD5还是能玩)。 还是跟上一篇说的一样,当一个算法的复杂度提高的同时肯定会带来效率的降低,所以SHA和MD5比较起来的话,SHA更安全,MD5更高效。 由于HASH算法的不可逆性,所以我认为MD5和SHA主要还是应用在字符串的"加密"上。 由于

Linux 删除 当前下的 mysql-8.0.31 空文件夹

在Linux中,如果你想要删除当前目录下的名为mysql-8.0.31的空文件夹(即该文件夹内没有任何文件或子文件夹),你可以使用rmdir命令。但是,如果mysql-8.0.31文件夹并非完全为空(即它包含文件或子文件夹),rmdir命令会失败。 如果你的目标是删除mysql-8.0.31文件夹及其内部的所有内容(无论是否为空),你应该使用rm命令结合-r(或-R,它们是等价的)选项来递归地删

《C++标准库》读书笔记/第一天(C++新特性(1))

C++11新特性(1) 以auto完成类型自动推导 auto i=42; //以auto声明的变量,其类型会根据其初值被自动推倒出来,因此一定需要一个初始化操作; static auto a=0.19;//可以用额外限定符修饰 vector<string> v;  auto pos=v.begin();//如果类型很长或类型表达式复杂 auto很有用; auto l=[] (int

12C 新特性,MOVE DATAFILE 在线移动 包括system, 附带改名 NID ,cdb_data_files视图坏了

ALTER DATABASE MOVE DATAFILE  可以改名 可以move file,全部一个命令。 resue 可以重用,keep好像不生效!!! system照移动不误-------- SQL> select file_name, status, online_status from dba_data_files where tablespace_name='SYSTEM'

Cmake之3.0版本重要特性及用法实例(十三)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门视频实战课 🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧

Java8特性:分组、提取字段、去重、过滤、差集、交集

总结下自己使用过的特性 将对象集合根据某个字段分组 //根据id分组Map<String, List<Bean>> newMap = successCf.stream().collect(Collectors.groupingBy(b -> b.getId().trim())); 获取对象集合里面的某个字段的集合 List<Bean> list = new ArrayList<>