mysql8.x实践系列(3)Qt客户端连接mysql报错:Authentication plugin ‘caching_sha2_password‘ reported error

2023-05-16

一、现象描述

Qt客户端远程连接mysql8.x服务器,会报错:

Authentication plugin 'caching_sha2_password' reported error:Authentication require secure connection.

因为在mysql8之后,加密规则默认是caching_sha2_password。caching_sha2_password 是MySQL 8.0.4引入的一个新的身份验证插件,它的特点被其命名揭露无疑:

  • sha2_password:其实就是 sha256_password,这是 MySQL5.6 就引入的身份验证插件,其优点是对加盐密码进行多轮 SHA256 哈希,以确保哈希转换更安全。其缺点为它要求使用安全连接或使用 RSA 密钥对进行密码交换的未加密连接,因此其身份验证的效率较低。
  • caching:在 sha256_password 的基础上增加缓存,有缓存的情况下不需要加密连接或 RSA 密钥对,以达到安全和效率并存。

二、解决办法

1、桌面-开始-鼠标右键-运行-cmd

2、进入mysql的路径

cd C:\Program Files\MySQL\MySQL Server 8.0\bin

3、命令格式说明

mysql --ssl-mode=DISABLED -u <username> -p<password> -h <host> -P<port>

4、连接

(1)错误的连接方式

C:\Program Files\MySQL\MySQL Server 8.0\bin>./mysql.exe -u root -pMypwd123456$ -h 192.168.216.100 -P3306
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2061 (HY000): Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.

【分析】mysql8默认使用插件caching_sha2_password,client远程连接报这个错误,我们需要拿到server的public key来加密password。

【解决】加参数可以解决:--get-server-public-key

(2)正确的连接方式1,使用--get-server-public-key
C:\Program Files\MySQL\MySQL Server 8.0\bin>./mysql.exe -u root -pMypwd123456$ -h 192.168.216.100 -P3306 --get-server-public-key

C:\Users\hello>cd C:\Program Files\MySQL\MySQL Server 8.0\bin
C:\Program Files\MySQL\MySQL Server 8.0\bin>./mysql.exe -u root -pMypwd123456$ -h 192.168.216.100 -P3306 --get-server-public-key
'.' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

C:\Program Files\MySQL\MySQL Server 8.0\bin>mysql -u root -pMypwd123456$ -h 192.168.216.100 -P3306 --get-server-public-key
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.31 MySQL Community Server - GPL

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

如果root用户登陆成功,有了缓存,则下次认证时,未加密连接不再要求使用RSA密钥对。

(3)正确的连接方式2,使用--server-public-key-path
把公钥文件从mysql datadir拷贝出来,例如从C:\ProgramData\MySQL\MySQL Server 8.0\Data\public_key.pem"到"C:\Users\hello\Downloads\public_key.pem",然后再
C:\Program Files\MySQL\MySQL Server 8.0\bin>./mysql.exe -u root -pMypwd123456$ -h 192.168.216.100 -P3306 --server-public-key-path="C:\Users\hello\Downloads\public_key.pem"

三、Qt客户端怎么远程连接MySQL8.x?

1、先额外启动一个进程,cmd命令远程连接加参数,使得mysql服务器后台有了认证的缓存,下次未加密连接就不再要求使用RSA密钥对。

mysql.exe文件是官方自带的客户端工具(mysqld.exe文件是服务器,一个字母之差),可以拷贝自安装路径C:\Program Files\MySQL\MySQL Server 8.0\bin

 mysql.exe是绿色软件,带上libcrypto-1_1-x64.dll和libssl-1_1-x64.dll依赖库即可使用。

void Widget::init()
{
    QProcess *pProces = new QProcess(this);
    connect(pProces, SIGNAL(readyRead()), this, SLOT(on_read()));
    QStringList arguments;
    arguments << "-u"
         << "root"
         << "-pMypwd123456$"
         << "-h"
         << "192.168.216.100"
         << "-P3306"
         << "--get-server-public-key";
    pProces->start("./mysql.exe", arguments); // mysql.exe拷贝来自安装路径C:\Program Files\MySQL\MySQL Server 8.0\bin

    if (pProces->waitForStarted()) //如果是startDetached表示守护者进程,该函数总会提示失败
    {
        qDebug() << "启动成功";
    }
    else
    {
        qDebug() << "启动失败 error:" << pProces->errorString();
    }

    while (!pProces->waitForFinished(200))
    {
        qDebug() << "wait";
        QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
        break;
    }
}

void Widget::on_read()
{
    QProcess *pProces = (QProcess *)sender();
    qDebug() << QString::fromLocal8Bit(pProces->readAll());
}

2、接下来就是qt的数据库常规操作了

// 创建数据库连接
QSqlDatabase ConnectionPool::createConnection(const QString &connectionName)
{
    static int sn = 0;

    //先检查数据库连接对象前置条件
    if (!checkDatabase())
    {
        qDebug() << m_pInfo->databaseType << "checkDatabase false";
        return QSqlDatabase();
    }

    //创建一个新的数据库连接
    QSqlDatabase db = QSqlDatabase::addDatabase(m_pInfo->databaseType, connectionName);

    if ("QSQLITE" == m_pInfo->databaseType)
    {
        db.setDatabaseName(m_pInfo->databaseName);
    }
    else // eg."QMYSQL"
    {
        db.setHostName(m_pInfo->hostName);
        if (m_pInfo->port != 0)
        {
            db.setPort(m_pInfo->port);
        }

        db.setDatabaseName(m_pInfo->databaseName);
        db.setUserName(m_pInfo->username);
        db.setPassword(m_pInfo->password);
    }

    if (db.open()) //打开数据库
    {
        qDebug() << QString("Connection created:%1, type:%2, sn:%3").arg(connectionName).arg(m_pInfo->databaseType).arg(++sn);

        if (db.driver()->hasFeature(QSqlDriver::Transactions))
        {
            qDebug() << m_pInfo->databaseType << "support Transaction";
        }
        else
        {
            qDebug() << m_pInfo->databaseType << "not support Transaction";
        }

        return db;
    }
    else
    {
        qDebug() << m_pInfo->databaseType << "Create connection error:" << db.lastError().text();

        if (QSqlDatabase::contains(connectionName))
        {
            QSqlDatabase::removeDatabase(connectionName); //关闭数据库
            qDebug() << QString("Connection deleted: %1").arg(connectionName);
        }

        return QSqlDatabase();
    }
}

四、零零星星的知识点

1、要求使用安全连接或使用 RSA 密钥对进行密码交换的未加密连接是什么意思?

caching_sha2_password 对密码安全性要求更高,要求用户认证过程中在网络传输的密码是加密的:

  • 如果是 SSL 加密连接,则使用 SSL 证书和密钥对来完成 "对称加密密钥对(在TSL握手中生成)" 的交换,后续使用“对称加密密钥对” 加密密码和数据。具体见:MySQL:SSL 连接浅析;
  • 如果是非 SSL 加密连接,则在连接建立时客户端使用 MySQL Server 端的 RSA 公钥加密用户密码,Server 端使用 RSA 私钥解密验证密码的正确性,可以防止密码在网络传输时被窥探。

tips:SSL加密连接会不止会加密用户密码,还会加密数据(SQL请求、返回的结果);非加密连接只使用 RSA 密钥对进行用户密码的加密。

2、未加密连接是怎么使用 RSA 密钥对进行密码交换的?

当用户验证成功后,会把用户密码哈希缓存起来。新连接客户端发起登录请求时,MySQL Server 端会判断是否命中缓存,如果没有缓存,对于未加密的连接,caching_sha2_password 插件要求连接建立时使用 RSA 进行加密密码交换,否则报错,其过程为:

  • 客户端如果拥有服务端的 RSA 公钥,则使用 --server-public-key-path 选项指定 RSA 公钥文件;
  • 客户端使用 RSA 公钥对用户密码进行加密,请求连接;
  • 服务端使用 RSA 私钥进行解密,验证密码的正确性。

如果客户端没有保存服务端的 RSA 公钥文件,也可以使用 --get-server-public-key 选项从服务器请求公钥,则在建立连接时,服务端会先将 RSA 公钥发送给客户端。

如果 --server-public-key-path、--get-server-public-key 都没有指定,则会报下面这个经典的错误:

ERROR 2061 (HY000): Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.

3、在 MySQL 8.0.4 之后创建的所有新用户将默认使用 caching_sha2_password 作为他们的身份验证插件。做主从复制的时候也会碰到这种情况,cmd需要加get_master_public_key=1;

客户端如果拥有服务端的 RSA 公钥,则使用 --server-public-key-path 选项指定RSA 公钥文件;
客户端使用 RSA 公钥对用户密码进行加密,请求连接;
服务端使用 RSA 私钥进行解密,验证密码的正确性。

4、RSA 密钥对保存在哪里?

 C:\ProgramData\MySQL\MySQL Server 8.0\my.ini字段datadir记录了当前保存的数据路径。

RSA密钥对默认保存在MySQL的datadir下,用于非SSL连接时的密码加密交换:使用RSA公钥加密密码,使用RSA私钥解密。

private_key.pem      RSA公钥
public_key.pem       RSA私钥

5、密码哈希缓存何时失效?

当用户验证成功后,密码哈希会缓存起来,缓存会在以下情况被清理:

  • 当用户的密码被更改时;
  • 当使用 RENAME USER 重命名用户时;
  • 执行 FLUSH PRIVILEGES 时;
  • MySQL重启。

6、怎么查看用户的加密类型

mysql> use mysql;
Database changed
mysql> SELECT Host, User, plugin from user;
+-----------+------------------+-----------------------+
| Host      | User             | plugin                |
+-----------+------------------+-----------------------+
| %         | root             | caching_sha2_password |
| localhost | mysql.infoschema | caching_sha2_password |
| localhost | mysql.session    | caching_sha2_password |
| localhost | mysql.sys        | caching_sha2_password |
| localhost | root             | caching_sha2_password |
+-----------+------------------+-----------------------+
5 rows in set (0.00 sec)

7、查看公钥文件的内容

mysql> SHOW STATUS LIKE "Caching_sha2_password_rsa_public_key";

8、如果你不想使用默认的 caching_sha2_password 插件,也可以使用一些其他的插件创建帐户,你必须明确指定插件。例如,使用 mysql_native_password 插件,使用此语句:

CREATE USER 'nativeuser'@'localhost'
IDENTIFIED WITH mysql_native_password BY 'password';

9、遗留问题

MySQL安装时出现current root password的解决方法??

Reconfigure,界面需要密码输入,但是总是check失败,网上找的方法说是remove server,重装!囧,,, 

五、参考文献

https://www.jianshu.com/p/d677bb316ab0

https://www.cnblogs.com/zgrey/p/15398633.html

MySQL :: MySQL 8.0 Reference Manual :: 6.4.1.2 Caching SHA-2 Pluggable Authentication

MySQL :: MySQL 8.0.4 : New Default Authentication Plugin : caching_sha2_password

https://docs.oracle.com/cd/E17952_01/mysql-shell-8.0-en/mysqlsh.html

https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/caching-sha2-pluggable-authentication.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql8.x实践系列(3)Qt客户端连接mysql报错:Authentication plugin ‘caching_sha2_password‘ reported error 的相关文章

  • 数据结构对齐

    xfeff xfeff 对齐的算法 xff1a 由于各个平台和编译器的不同 xff0c 现以本人使用的gcc version 3 2 2编译器 xff08 32位x86平台 xff09 为例子 xff0c 来讨论编译器对struct数据结构
  • 关于示波器测485串口波特率的使用方法总结

    之前没有用过示波器 xff0c 更不知道怎么来测试串口的波特率 xff0c 结果遇到一客户说我们产品的波特率达不到9600 xff0c 只有9100 xff0c 为了验证这一说法 xff0c 我们只能自己测试一下 说明 xff1a 产品通过
  • C语言对寄存器封装

    一 封装外设 用C语言代码把外设地址映射用宏定义封装 span class hljs comment 外设基地址 span span class hljs preprocessor define PERIPH BASE unsigned i
  • JavaJDK下载安装与环境配置(Windows 10 超详细的图文版教程 )

    前言 xff1a 对于很多初学者来说 xff0c 我想可能很多人都会遇到JDK环境变量的配置问题 明明就是按照度娘上的教程去一步步配置的 xff0c 但还是会有很多的人出现配置不成功的问题 所以今天在这里分享一下windows 10 系统下
  • win32 获取窗口句柄的方法

    第一种方法是根据窗口句柄值获取窗口句柄 使用spy 43 43 获取指定窗口的窗口句柄值 xff0c 因为句柄值是16进制数 xff0c 所以前面加0x 然后进行强制转换为HWND类型 HWND hWnd 61 HWND 0x0028072
  • 当设置display:inline;时li的宽度无效的解决方法

    若制作导航栏时 xff0c 使用列表li 的定义时 xff0c 若想加上一个背景图 xff0c 这时候若定义li的一个属性为 li display inline width 83px height 30px xff0c 则浏览器会无视后面的
  • js文本框或者按钮鼠标悬停提示说明文字

    html页面中很多元素会用到文本提示 xff0c 当鼠标悬停之后显示一段说明文字 显示说明性文字 function tips id str t 61 getTop document getElementById id document ge
  • localstorage兼容ie8以下浏览器的问题

    最近在做一个网站 xff0c 由于希望尽可能减小服务器的压力 xff0c 也想提高网站的运转速度 xff0c 就想尽可能少的在服务器上读写数据以及下载重复数据 xff0c 需要重复使用的数据 xff0c 就储存在本地 xff0c 能在本地进
  • HTTP请求返回状态码中301与302的状态码区别

    一 xff0e 官方说法 301 xff0c 302 都是HTTP状态的编码 xff0c 都代表着某个URL发生了转移 xff0c 不同之处在于 xff1a 301 redirect 301 代表永久性转移 Permanently Move
  • java防止 csrf 攻击 --- 采用 spring .

    CSRF xff08 Cross site request forgery xff09 xff0c 中文名称 xff1a 跨站请求伪造 xff0c 也被称为 xff1a one click attack session riding xff
  • Gson解析数组多类型元素

    why used gson Gson is a Java library that can be used to convert Java Objects into their JSON representation It can also
  • js中获取时间new Date()详细介绍

    1 var myDate 61 new Date Date 返回当日的日期和时间 getDate 从 Date 对象返回一个月中的某一天 1 31 getDay 从 Date 对象返回一周中的某一天 0 6 getMonth 从 Date
  • 如何让一个行内元素(如一张图片)在div中居中

    xff08 1 xff09 第一种 xff1a 用vertical align lt div class 61 34 method1 34 gt lt span class 61 34 tiptop 34 gt lt span gt lt
  • 释放webpack tree-shaking潜力之webpack-deep-scope-analysis-plugin

    在上周末广州举办的 feday 中 webpack 的核心开发者 Sean 在介绍 webpack 插件系统原理时 隆重介绍了一个中国学生于 Google 夏令营 在导师 Tobias 带领下写的一个 webpack 插件 https gi
  • iframe跨域通信的通用解决方案

    此方案已有新版本 请查看 iframe跨域通信的通用解决方案 第二弹 xff08 终极解决方案 xff09 本文章可做技术学习供继续交流 一 背景 在这个Web页面越来越丰富的时代 xff0c 页面通过iframe嵌入其他的页面也越来越常见
  • C++实现轻量级RPC分布式网络通信框架

    前言 xff1a 2022 4 14更新 xff1a 在我重新回顾这篇文章的时候 xff0c 我觉得里面内容有点乱 xff0c 主要还是因为RPC里面涉及到很多概念和知识点 本来代码内容就已经挺抽象了 xff0c 还要结合各种概念 xff0
  • 浅谈JavaScript设计模式

    创建型模式 xff1a 该模式处理的是用于创建对象的各种机制 工厂方法抽象工厂建造者原型单例 结构型模式 xff1a 考虑的是对象的组成以及对象彼此之间的关系 适配器桥接组合装饰器外观享元代理 行为型模式 xff1a 关注的是对象之间的依赖
  • Ardupilot-SITL仿真模拟调试

    1 配置SITL仿真调试 span class token punctuation span span class token operator span waf configure span class token operator sp
  • PX4——Range Finder 篇

    Range Finder 此处选用的是 Benewake 下的 Lidar 参数设置 General Configuration 除了官方的参数设置外 xff0c 我在 EKF2 中还找到了 EKF2 RNG AID 参数 xff0c 用来
  • STM32 时钟 定时器基础

    STM32 Clock Tree 时钟源 HSI xff1a xff08 High Speed Internal xff09 内部的 RC 震荡电路产生时钟信号 HSE xff1a xff08 High Speed External xff

随机推荐

  • Albumentation

    文章目录 AlbumentationClassificationSegmentationDetectionKeyPoints Augmentation Albumentation 所有实现的变换 变换以及支持的类型 此处 Classific
  • Pytorch 分布式训练

    文章目录 分布式训练OverviewDP or DDPDPDDP TCP 初始化Moco TCP 初始化例子 ENV 初始化可选后端进程间通信操作Template 区分概念 xff1a Machine vs Device 多机 Machin
  • FLANN C++ 使用

    FLANN FLANN 库 xff0c 包含 KNN 算法 众多工程 xff08 例如 OpenCV xff09 使用了 FLANN xff0c 这里单独介绍这个库 xff0c 方便以后单独使用 由官方 Latex 编译的文档链接 xff0
  • HDF5 C++ 使用

    HDF5 简介 HDF5 可以用来存储异构数据对象 xff0c 包括图片 xff0c 表 xff0c 图 xff0c 甚至 PDF 和 Excel HDF5 中的数据存储在不同组 Group 中 xff0c 类似于 Linux 文件树结构
  • Pandoc 使用

    文章目录 PandocInstallationLatex 到 Word命令详解 Pandoc Installation MacOS brew span class token function install span pandoc Lat
  • Docker -- DockerFile 讲解

    文章目录 DockerFile 指令讲解FROMCOPY 写在开头 xff1a 实验室给的电脑只能装 20 04 然后跑仿真需要在 18 04 20 04 的 Gazebo 居然不能支持 xff01 要是有人知道如何在 20 04 中使用
  • MySQL介绍及CRUD操作。

    目录 一 基本介绍 1 数据库结构 2 数据库增删改查 二 增删改查语句 1 insert 添加数据 2 update 修改操作 3 delete 删除操作 4 select 查询操作 5 加密和系统函数 6 流程控制函数 三 表的增删改查
  • Docker 容器

    文章目录 容器图形界面XserverVNC 容器 图形界面 Xserver 采用 ROS 官网的教程 这里相当于是将容器的图形信息发送给宿主的 Xserver 然后显示在你的电脑屏幕上 首先需要打开主机 Xserver 权限 xff1a x
  • C++ -- OpenMP 笔记

    64 toc OMP CMake Setup set CMAKE CXX STANDARD 14 set CMAKE CXX STANDARD REQUIRED ON find package OpenMP REQUIRED Set Fla
  • 转载:亚像素数值极值检测算法总结

    动机 在计算机视觉领域 xff0c 经常需要检测极值位置 xff0c 比如SIFT关键点检测 模板匹配获得最大响应位置 统计直方图峰值位置 边缘检测等等 xff0c 有时只需要像素精度就可以 xff0c 有时则需要亚像素精度 本文尝试总结几
  • C++动态库*.dll文件的Debug/Release版本是否可以混用(交叉用)?

    1 现象 xff1a 使用一些第三方的dll xff0c 比如opencv xff0c 会分别生成debug和release的dll xff0c 在exe中必须要引用指定版本的dll xff0c 不能混用 xff0c 否则会出错 xff1b
  • EditPlus编辑器选中列的方法

    1 主菜单 xff1a 编辑 gt 选择 gt 按列选择 2 先按下 Alt 43 C xff0c 释放 xff0c 然后移动鼠标或键盘上下左右键进行选择
  • 好教程推荐系列:收录常见的Qt面试题

    Qt面试题 xff1a 1 connect几个类型的区别 2 自绘控件 3 Qt常用线程几种方式 xff0c 数据竞争 xff0c 加锁同步等等 4 Model View Delegate的理解 5 Qt的插件机制是怎么做的 6 信号槽机制
  • Qt5多线程/线程池技术集锦(2)如何在子线程更新ui窗口

    上一篇介绍了基础知识 Qt5多线程 线程池技术集锦 xff08 1 xff09 基础知识篇 libaineu2004的博客 CSDN博客 qt5 线程池 Qt下多线程的几种使用方法 以及注意事项 第一种方法 1 创建一个类从QThread类
  • mysql8.x实践系列(1)centos7和win10安装mysql8.x的注意事项,与5.x版本有许多不同

    一 先看Centos7的安装情况 1 多年前写了一篇文章 xff1a centos7安装和卸载mysql5 7 18完整实用教程 https blog csdn net libaineu2004 article details 762121
  • halcon分别求取Region区域顶点和最高点

    Word编辑器可以生成很多形状 xff0c 举例七角星 求顶点和最高点的源码如下 xff1a 求取区域顶点 方法1 dev close window read image Image1 39 testpic 求取区域顶点 png 39 de
  • 3D激光线扫相机与结构光相机的区别

    激光线扫相机 激光相机基于三角测量 xff0c 可精确捕获3D形状 数百万个点 更精确地说 xff0c 它们的工作原理是将激光点或激光线投射到物体上 xff0c 然后用传感器捕获其反射 由于传感器的位置与激光源的距离已知 xff0c 因此可
  • SQL server 2008 r2 安装教程

    1 下载sql server 2008 r2的安装包 如果需要安装包可以私我 密钥自动输入 2 打开安装包 点击setup exe 3 点击 安装 下一步选择 全新安装或向现有的安装添加功能 4 检测完成后点击确定 5 选择输入产品密钥 这
  • mysql8.x实践系列(2)Qt客户端怎么操作PostgreSql数据库?怎么保存和读取二进制图片?

    1 Windows安装PostgreSql xff08 1 xff09 安装 https www postgresql org download windows https www enterprisedb com downloads po
  • mysql8.x实践系列(3)Qt客户端连接mysql报错:Authentication plugin ‘caching_sha2_password‘ reported error

    一 现象描述 Qt客户端远程连接mysql8 x服务器 xff0c 会报错 xff1a Authentication plugin 39 caching sha2 password 39 reported error Authenticat