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

相关文章

Rust中的Drop特性之解读自动化资源清理的魔法

《Rust中的Drop特性之解读自动化资源清理的魔法》Rust通过Drop特性实现了自动清理机制,确保资源在对象超出作用域时自动释放,避免了手动管理资源时可能出现的内存泄漏或双重释放问题,智能指针如B... 目录自动清理机制:Rust 的析构函数提前释放资源:std::mem::drop android的妙

五大特性引领创新! 深度操作系统 deepin 25 Preview预览版发布

《五大特性引领创新!深度操作系统deepin25Preview预览版发布》今日,深度操作系统正式推出deepin25Preview版本,该版本集成了五大核心特性:磐石系统、全新DDE、Tr... 深度操作系统今日发布了 deepin 25 Preview,新版本囊括五大特性:磐石系统、全新 DDE、Tree

mysql-8.0.30压缩包版安装和配置MySQL环境过程

《mysql-8.0.30压缩包版安装和配置MySQL环境过程》该文章介绍了如何在Windows系统中下载、安装和配置MySQL数据库,包括下载地址、解压文件、创建和配置my.ini文件、设置环境变量... 目录压缩包安装配置下载配置环境变量下载和初始化总结压缩包安装配置下载下载地址:https://d

mysql重置root密码的完整步骤(适用于5.7和8.0)

《mysql重置root密码的完整步骤(适用于5.7和8.0)》:本文主要介绍mysql重置root密码的完整步骤,文中描述了如何停止MySQL服务、以管理员身份打开命令行、替换配置文件路径、修改... 目录第一步:先停止mysql服务,一定要停止!方式一:通过命令行关闭mysql服务方式二:通过服务项关闭

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,它们是等价的)选项来递归地删