iis服务器助手广告
返回顶部
首页 > 资讯 > 数据库 >MySQL新身份验证插件caching_sha2_password
  • 789
分享到

MySQL新身份验证插件caching_sha2_password

mysql数据库java 2023-09-16 16:09:30 789人浏览 八月长安
摘要

同事反馈了一个问题,Mysql客户端连接数据库的时候,提示这个错误, ERROR 2059 (HY000): Plugin caching_sha2_passWord could not be loa

同事反馈了一个问题,Mysql客户端连接数据库的时候,提示这个错误,

ERROR 2059 (HY000): Plugin caching_sha2_passWord could not be loaded: /usr/lib64/mariadb/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory

这其实是个mysql新的身份验证插件caching_sha2_password的问题,碰巧看到Greatsql社区的这篇文章《浅谈 MySQL 新的身份验证插件 caching_sha2_password》,可以借鉴一下。

介绍

从 MySQL 8.0.4 开始,MySQL 默认身份验证插件从 mysql_native_password 改为 caching_sha2_password 。相应地,libmysqlclient 也使用 caching_sha2_password 作为默认的身份验证机制。

起因

在这之前 MySQL 5.6/5.7 使用的默认密码插件是 mysql_native_passwordmysql_native_password 的特点是不需要加密的连接。该插件验证速度特别快,但是不够安全,因为,mysql_native_password 使用的是于 SHA1 算法,NIST(美国国家标准与技术研究院)在很早之前就已建议停止使用 SHA1 算法,因为 SHA1 和其他哈希算法(例如 MD5)容易被破解。

其实从 MySQL 5.6 开始就引入了更安全的认证机制:ha256_password 认证插件。它使用一个加盐密码(salted password)进行多轮 SHA256 哈希(数千轮哈希,暴力破解更难),以确保哈希值转换更安全。但是,建立安全连接和多轮 hash 加密很耗费时间。虽然安全性更高,但是验证速度不够快。

改进

MySQL 试图结合二者的优点。于是在 MySQL-8.0.3 引入了一个新的身份验证插件 caching_sha2_password ,作为sha256_password的代替方案,在sha256_password 的基础上进行了改进补上了短板,既解决安全性问题又解决性能问题。与此同时 sha256_password将退出时代的浪潮。MySQL 预计在未来版本中将其删除。使用 sha256_password 进行身份验证的 MySQL 账户建议转为 caching_sha2_password

结果

因为默认身份验证机制的更改,大家在使用 MySQL 8.0 时候出现了很多相关的问题。网上的大部分教程都是教人改回mysql_native_password验证方式 mysql_native_password。但是笔者认为,MySQL 更改默认插件是为了更好的安全性考虑。如果有 MySQL 服务要公网上使用,建议还是尽量使用 caching_sha2_password作为认证插件。

示例:使用旧版本客户端连接时报错:

shell> mysql -uroot -pERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded

具体机制分析

mysql_native_password

mysql_native_password 作为 MySQL 5.6/5.7 的默认密码插件 。其优点是它支持 challenge-response (挑战应答方式),这是非常快的验证机制,无需在网络中发送实际密码,并且不需要加密的连接。

客户端连接MySQL实例时,首先需要从服务器端获得一个20字节的随机数。

此外,mysql_native_password 使用了新的哈希算法进行认证校验。对于用户的原始密码,通过SHA1(SHA1(password))两次哈希计算结果保存在 mysql.user 表的 authentication_string 列中。其中用户密码通过哈希计算后保存,没有加盐(salt)。

通过上述这样的处理,MySQL数据库本身已然非常安全。然而,随着时间的推移,目前存在以下两种潜在风险:

  • SHA1哈希算法也已经变得比较容易破解。
  • 相同的密码拥有相同的哈希值。

SHA1、MD5等之前的哈希算法都已然不再安全,更为安全的SHA256、SHA512哈希算法也已推出。作为数据存储最终承载者,应该使用更新的加密机制机制。

caching_sha2_password

在cache_sha2_password密码认证机制下,其改进如下所示:

  • 保存在 authentication_string 中的哈希值为加盐后的值,即使两个不同用户的密码相同,保存在计算机中的哈希值也不同。
  • 哈希算法升级为了更为安全SHA256算法。
  • 哈希算法的 round 次数从原来的两次,提升为了5000次,round次数越多,每次计算哈希值的代价越大,破解难度也就越大。
  • 用TLS的加密或RSA密钥传输方式从客户端将密码传送到服务端。

caching_sha2_password 通讯过程解析

  1. 对于大多数连接尝试,当密码的哈希值有缓存在内存中时,它的验证是基于 SHA256 的challenge-response机制(与 mysql_native_password 中基于 SHA1 的challenge-response机制相比更快),下图演示了在有哈希缓存时的验证流程。

Image

challenge-response 的认证模式

从图中我们看到,客户端对密码进行多重哈希加密生成 Scramble 发送给服务端, 服务端检查内存的缓存(memory cache)中是否存在该条目。当值在缓存中存在证明本次连接合法,服务器会告诉客户端快速认证成功:发送 fast_auth_success 包到客户端,并且发送确认报文。然后服务器就可以和客户端正常通信了。

  1. 当没有这种缓存时,caching_sha2_password 需要**使用安全连接(SSL/STL)**进行密码交换。考虑到用户更改和 FLUSH PRIVILEGES 操作频率比较低,所以在大多数情况下,使用的都是基于challenge-response的身份验证,不用建立安全连接。这省去了建立安全连接需要耗费的资源。下图总结了完整的验证流程。

Image

从图中我们看到,服务器在收到 Scramble 后,发现缓存中没有对应的值,服务器会告诉客户端,要建立安全连接使用完整的身份验证流程:发送 perfORM_full_authentication 包到客户端,之后客户端接收服务器的公钥(公钥文件如果已存在就省去这个步骤)。如果安全连接(SSL/STL)已经建立基于 ,则可以直接发送明文密码到服务端。如果没有安全连接,客户端就会 向服务端发起获取公钥的请求(或者指定服务端公钥文件),使用公钥加密密码,发送到服务端。服务器通过 SHA256 算法计算得到哈希值,判断是否用户认证通过,通过则发送 OK 包到客户端。然后服务器就可以和客户端正常通信了。

这里详细解释一下 RSA 非对称加密的通信过程:

首先先明确一个概念:非对称加密算法中,有两个密钥:公钥和私钥。如果用公钥进行加密,只有对应的私钥才能解密;反之亦然。

RSA 密钥交换过程:

服务器生成一对密钥并将公钥向其他方公开(以明文发送给客户端)。

客户端使用服务器的公钥对密码进行加密后发送给服务器。

服务器用对应的私钥对加密信息进行解密。

因为客户端用公钥加密的信息只能用服务器的私钥解密,所以这个连接过程可以视为加密通信。

Image

需要注意的地方

默认身份验证插件的更改意味着:

在 MySQL 8.0.4 之后创建的所有新用户将默认使用 caching_sha2_password 作为身份验证插件。

mysql> SELECT USER,PLUGIN FROM mysql.`user` ;+------------------+-----------------------+| USER             | PLUGIN                |+------------------+-----------------------+| root             | caching_sha2_password || mysql.infoschema | caching_sha2_password || mysql.session    | caching_sha2_password || mysql.sys        | caching_sha2_password |+------------------+-----------------------+6 rows in set (0.06 sec)

libmysqlclient 默认使用 caching_sha2_password,可以通过手动修改切换到其他的身份验证插件。

使用 caching_sha2_password 插件的客户端,连接到服务器时,不会使用名为密码。密码传输是如何进行的取决于是否使用安全连接或 RSA 对密码加密:

  • 如果连接是安全的,可以不使用 RSA 密钥。适用于使用 TLS 加密的 tcp 连接,以及 Unix 套接字文件和共享内存连接。密码以明文格式发送,但不能被窃听,因为连接是安全的。
  • 如果连接不是安全的,可以使用 RSA 密钥对。适用于未使用 TLS 加密的 TCP 连接和 named-pipe 连接。RSA 仅用于客户端和服务器之间的密码交换,防止密码被截取。当服务器接收到使用公钥加密的密码后,它使用私钥解密。一个随机字符串用在加密中,防止重放攻击(repeat attacks)。

在 MySQL 8.0.3 以上版本中。默认自动完成 RSA 密钥对进行密码交换。

关于主从复制

如果用于复制的用户使用了 caching_sha2_password身份验证插件,并且没有启用安全连接( 在group_replication_recovery 启用SSL支持),MySQL 将使用 RSA 密钥对进行密码的交换,可以把主节点的公钥手动拷贝到从节点的服务器中,也可以设置成:自动为请求加入组的节点提供公钥。

复制本身是支持加密的连接。在 MySQL 8.0.4中,添加了复制对 RSA 加密的支持。

  • CHANGE MASTER 可以通过以下个参数来启用基于 caching_sha2_password RSA 密钥来交换密码:

     指定 RSA 公钥路径- MASTER_PUBLIC_KEY_PATH ="key_file_path"    #从服务端获取 RSA 公钥- GET_MASTER_PUBLIC_KEY = {0 | 1}
  • Group Replication 可以通过以下个参数来启用基于 caching_sha2_password RSA 密钥来交换密码:

    #指定 RSA 公钥路径––group-replication-recovery-public-key-path#从服务端获取 RSA 公钥––group-replication-recovery-get-public-key

数据库升级

数据库升级到 MySQL 8.0.4 会怎样?

在升级之前创建的用户,身份认证插件不会更改。在升级之后创建的用户默认使用 aching_sha2_password身份验证插件。除非使用 --default-authentication-plugin 手动指定认证插件插件。因为不会更改升级前已有用户。因此,使用升级后依然可以用旧版本的客户端连接这些用户。

相应地,libmysqlclient 支持 mysql_options() C api函数的 MYSQL_DEFAULT_AUTH 选项。(对于 MySQL 包中可用的基于 libmysqlclient 的客户端工具,可以用 ––default-auth 命令行选项达到相同的目的。)

建议使用 cache_sha2_password 因为它更安全。并且升级 libmysqlclient 到 MySQL 8.0.4 或更高版本,以便支持新的身份验证插件。

参考资料

[MySQL 8.0.4 : New Default Authentication Plugin]

caching_sha2_password]https://dev.mysql.com/blog-arcHive/mysql-8-0-4-new-default-authentication-plugin-caching_sha2_password

[得物技术浅谈MySQL 8.0:新的身份验证插件]

Https://segmentfault.com/a/1190000040733952

[MySQL 8.0密码认证机制升级,不知道可能导致业务不可用!!]

https://mp.weixin.qq.com/s/jfoH6D8NfoaNN7eexbzKGA

[组复制安装部署 | 全方位认识 MySQL 8.0 Group Replication]

https://mp.weixin.qq.com/s/sydu0alXDECcHm5GNMvtdA

来源地址:https://blog.csdn.net/song854601134/article/details/130942178

您可能感兴趣的文档:

--结束END--

本文标题: MySQL新身份验证插件caching_sha2_password

本文链接: https://www.lsjlt.com/news/410118.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL新身份验证插件caching_sha2_password
    同事反馈了一个问题,MySQL客户端连接数据库的时候,提示这个错误, ERROR 2059 (HY000): Plugin caching_sha2_password could not be loa...
    99+
    2023-09-16
    mysql 数据库 java
  • NetCore Mysql 身份验证方法“caching_sha2_password”失败:Authentication method ‘caching_sha2_password‘ failed.
    最新部署的Net6 Webapi项目,服务器重新启动之后连接mysql数据库偶尔会出现错误信息:Authentication method 'caching_sha2_password' failed. Either use a secur...
    99+
    2023-08-31
    mysql netcore windows
  • PHP 身份验证
    HTTP 身份验证向客户端发送特殊的 HTTP 标头,并要求提供身份验证代码以访问该页面。 它是一种 PHP 内置方法,用于验证用户是否执行特定任务。PHP 有两种 HTTP 身份验证方法,Basi...
    99+
    2024-02-27
  • mysql身份验证方式在哪里
    mysql 身份验证方式主要有:基于密码的身份验证:用户提供用户名和密码,密码以哈希形式存储。基于证书的身份验证:使用 ssl 证书验证用户身份,每个用户拥有唯一的公钥和私钥。基于 ke...
    99+
    2024-04-05
    mysql
  • Kerberos身份验证问题
    Kerberos是一种网络身份验证协议,用于验证用户和服务器之间的身份。它使用票据传输技术,通过在客户端和服务器之间传递票据来实现身...
    99+
    2023-09-08
    Kerberos
  • 亚马逊身份证验证器
    亚马逊身份证验证器通常会在计算机或移动设备上运行,通过摄像头和麦克风来获取用户的身份信息,例如他们的脸部特征、指纹、虹膜等。然后,这些信息会被加密并传输到亚马逊的服务器上,以确保用户的账户安全。 有些亚马逊身份证验证器还可以使用密码和生物...
    99+
    2023-10-27
    亚马逊 身份证
  • mysql身份验证方式在哪里查看
    可以通过使用查询命令 select plugin from mysql.user where user = 'username' 查看 mysql 身份验证方式,结果...
    99+
    2024-04-14
    mysql
  • 如何使用身份验证发送邮件?
    哈喽!大家好,很高兴又见面了,我是编程网的一名作者,今天由我给大家带来一篇《如何使用身份验证发送邮件?》,本文主要会讲到等等知识点,希望大家一起学习进步,也欢迎大家关注、点赞、收藏、转发! 下面就一...
    99+
    2024-04-05
  • SSL证书如何验证网站身份
    SSL证书通过验证网站的身份来确保用户与网站之间的通信安全。验证网站身份的方式包括以下几种: 证书颁发机构(CA)验证:CA是负...
    99+
    2024-04-17
    SSL证书
  • 亚马逊验证身份信息
    如果您错过了验证身份的步骤,您可以尝试以下方法来解决问题: 检查您的电子邮件和账户通知:亚马逊通常会发送验证相关的电子邮件或在您的卖家中心账户中提供通知。检查您的电子邮件收件箱、垃圾邮件箱和亚马逊卖家中心账户,确保没有错过任何验证通知。...
    99+
    2023-10-27
    亚马逊 身份 信息
  • Node.js OAuth:身份验证的未来
    在当今数字时代,身份验证和授权对于保护用户数据和在线应用程序的安全至关重要。Node.js OAuth 是一种流行的框架,它通过提供一种标准化且安全的方法来处理第三方应用程序的认证和授权,极大地简化了应用程序开发。 什么是 OAuth...
    99+
    2024-02-19
    Node.js OAuth 身份验证 授权 安全
  • 亚马逊服务器身份验证
    AWS Ignite旨在确保只有拥有AWS Token的用户才能访问受保护的资源,包括AWS VIP 服务、存储空间和数据库。此外,AWS Ignite还保护您的数据和应用程序,使其免受未经授权的访问和数据泄露。 要使用AWS Ignit...
    99+
    2023-10-27
    亚马逊 身份验证 服务器
  • 带 cookie 身份验证的 Golang Websocket (Gorilla)
    在Web开发中,身份验证是一个必不可少的功能,而基于cookie的身份验证是一种常见的方式。Golang作为一种高效、简洁的编程语言,拥有强大的Web开发能力。本文将介绍如何使用Gor...
    99+
    2024-02-11
  • Java如何实现身份证号码验证
    小编给大家分享一下Java如何实现身份证号码验证,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体如下:package xxx;import ...
    99+
    2023-05-31
    java
  • Java身份证验证方法实例详解
    Java身份证验证方法实例详解身份证号码验证 1、号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,      八位数字出生日...
    99+
    2023-05-31
    java 身份证 验证
  • asp.core 同时兼容JWT身份验证和Cookies 身份验证两种模式(示例详解)
    在实际使用中,可能会遇到,aspi接口验证和view页面的登录验证情况。asp.core 同样支持两种兼容。 首先在startup.cs 启用身份验证。 var secrityKey...
    99+
    2024-04-02
  • VB.NET如何验证LDAP用户身份
    这篇文章主要为大家展示了“VB.NET如何验证LDAP用户身份”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“VB.NET如何验证LDAP用户身份”这篇文章吧。首先,我要讲的LDAP不是微软的Ac...
    99+
    2023-06-17
  • ASP.NET项目中的JWT身份验证
    JWT (JSON Web Token) 是一种用于身份验证的开放标准,可以在客户端和服务器之间传递安全的信息。在ASP.NET项目...
    99+
    2023-09-27
    ASP.NET
  • 一个简单的身份证校验
    需要椒盐虾身份证号的正确性,大致了搜了下, 感觉用datetime校验时间比正则,就改了下 代码 1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time ...
    99+
    2023-01-30
    身份证 简单
  • mysql用户身份验证查询的是哪个表
    mysql 用户身份验证信息存储在 mysql.user 表中,包含以下信息:用户名密码哈希值主机或 ip 地址权限创建和修改时间 MySQL 用户身份验证 查询的表: mysql.u...
    99+
    2024-04-14
    mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作