55 mysql 的登录认证流程

前言

这里我们来看一下 mysql 的认证的流程 

我们这里仅仅看 我们最常见的一个 认证的处理流程

我们经常会登录的时候 碰到各种异常信息

 

 

认证失败的大体流程

大概的流程是这样 

客户端和服务器建立连接之后, 服务器向客户端发送 salt

然后 客户端根据 salt 将客户端传入的密码加密之后, 以及相关登录信息传递给服务器 

然后 服务器进行验证, 验证失败, 响应对应的错误信息给客户端 

b7f2f81ceff12b4e7dd93170e3ee1aa0.png

 

服务器发送 salt 的信息如下 

3449c1caa4f7b03c71459f6a5a1c378f.png 

客户端发送的认证请求如下 

d78e4f8c3d6f517995695d770fa33880.png

 

 服务器响应的认证失败信息如下 

3c87143a1162269942ef12ed6cb48496.png

 

服务器发送 slat 的信息是在这里, 这里的 salt 是随机生成的 

077e1db2fab82ef6d406988a09fcc33e.png 

读取客户端的加密之后的信息 

c33f23fa6a16a0c2e15e577a3558f018.png 

然后是 密码的验证, 我们这里的流程是这样, 这里 数据库用 root 用户没有密码, 但是客户端这边传入了密码, 因此这里直接响应了 CA_AUTH_USER_REDENTIALS

23fefefbe4a62457a9849bcbbb3bff45.png

  

然后接着是 响应错误信息给客户端, 这里是响应 1045 ACCESS_DENIED_ERROR “Access denied for user 'root'@'192.168.220.1' (using password: YES)”

b5be01b8a38cc7e162af1fa3c3ce50f2.png

 

 

Access denied for user 'root'@'192.168.220.1' (using password: YES) 

这里同上, 几种情况 

首先需要传递密码, 其次是 root用户密码为空 或者 密码不对 会响应如下问题

上面演示了 mysql 密码为空, 但是 我输入了密码 之后的校验情况

我们现在来看一下 密码对不上的情况

用到了一些加密的特性来验证, 客户端输入的密文和数据库是否匹配 

scramble_arg 表示的是客户端传入的密文, message 表示数据库的密文, hash_stage2 表示此次登录验证的 slat 

2ebb889daa7b6b93749ba8d72d96369f.png

 

 

Access denied for user 'root'@'192.168.220.1' (using password: NO) 

这种情况就是 该用户有密码, 但是客户端 未传递 密码

验证是在这里, 如果数据库中该用户也没有密码, 直接 OK, 否则 响应 CR_AUTH_USER_CREDENTIALS

到后面的错误输出环节, 得到的错误信息 就是上面

d078fa1cad2859b912351ce7f33560e7.png

 

 

客户端加密, 服务器验证的逻辑仿写 

这里主要是 实现了一个 客户端这边 传递的密码的加密方式的处理

以及 服务器这边 验证 客户端秘钥, 服务器秘钥 的一个验证方式

可以参考学习一下, 需要导入 mysql-driver, netty 等等相关工具 

salt 是服务器的 ServerGreeting 传递回来的, 是一个 20自己的随机字节序列

clientPwd 是根据用户名, 密码 salt 加密之后的一个结果 

serverPwd 是 mysql 中 mysql.user 库中该用户记录的 authentication_string 秘钥序列

/*** Test09MysqlLoginEncrypt** @author Jerry.X.He* @version 1.0* @date 2023/8/9 9:31*/
public class Test09MysqlLoginEncrypt {// Test09MysqlLoginEncryptpublic static void main(String[] args) throws Exception {String salt = ("2c 4f 04 2a 30 13 69 71").replaceAll("\\s+", "")+ ("03 17 0a 1d 64 55 7e 68 1f 19 73 0a").replaceAll("\\s+", "");String clientPwd = "012cb36acb2a4c77217d8d70dc43e058c1c6448a";String serverPwd = "81F5E21E35407D884A6CD4A731AEBFB6AF209E1B";String clientPwdEncoded = ByteBufUtil.hexDump(clientEncryptPwd("root", "root", salt));boolean clientPwdIfMatch = checkClientPwdIfMatch(clientPwd, salt, serverPwd);AssertUtils.assert0(clientPwd, clientPwdEncoded, " check if clientEncryptPwd match ");AssertUtils.assert0(clientPwdIfMatch, " checkClientPwdIfMatch match ");int x = 0;}/*** checkClientPwdIfMatch** @return boolean* @author Jerry.X.He* @date 2023/8/9 10:31*/public static boolean checkClientPwdIfMatch(String clientPwd, String salt, String serverPwd) {byte[] saltBytes = ByteBufUtil.decodeHexDump(salt);byte[] pwdInClient = ByteBufUtil.decodeHexDump(clientPwd);byte[] pwdInDb = ByteBufUtil.decodeHexDump(serverPwd);MessageDigest digest = DigestUtils.getSha1Digest();digest.reset();digest.update(saltBytes);digest.update(pwdInDb);byte[] pwdSaltUpdated = digest.digest();my_crypt(pwdSaltUpdated, pwdSaltUpdated, pwdInClient);digest.reset();digest.update(pwdSaltUpdated);byte[] pwdFinalUpdated = digest.digest();boolean clientPwdEqualsDb = ByteBufUtil.hexDump(pwdFinalUpdated).equalsIgnoreCase(serverPwd);return clientPwdEqualsDb;}/*** clientEncryptPwd** @return byte[]* @author Jerry.X.He* @date 2023/8/9 10:22*/public static byte[] clientEncryptPwd(String username, String password, String salt) {MysqlNativePasswordPlugin plugin = new MysqlNativePasswordPlugin();NativeProtocol protocol = new MyNativeProtocol(new NullLogger(""));plugin.init(protocol);NativePacketPayload fromServer = new NativePacketPayload(ByteBufUtil.decodeHexDump(salt));List<NativePacketPayload> toSaveList = new ArrayList<>();plugin.setAuthenticationParameters(username, password);plugin.nextAuthenticationStep(fromServer, toSaveList);return toSaveList.get(0).getByteBuffer();}/*** my_crypt** @return void* @author Jerry.X.He* @date 2023/8/9 10:21*/public static void my_crypt(byte[] to, byte[] s1, byte[] s2) {for (int i = 0; i < s1.length; i++) {to[i] = (byte) (s1[i] ^ s2[i]);}}/*** Test09MysqlLoginEncrypt** @author Jerry.X.He* @version 1.0* @date 2023/8/9 10:19*/private static class MyNativeProtocol extends NativeProtocol {public MyNativeProtocol(Log logger) {super(logger);}@Overridepublic String getPasswordCharacterEncoding() {return "UTF-8";}}}

 

运行处理, 信息如下 

8decf59dbd830698990ae6a8e1658f78.png

 

 

完 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1535460.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

不同的二叉搜索树

题目 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5示例 2&#xff1a; 输入&#xff1a;n 1 输出&#xff…

运行QWen2-1.5b模型时报错“RuntimeError: cutlassF: no kernel found to launch!”

运行QWen2-1.5b模型时报错“RuntimeError: cutlassF: no kernel found to launch!” #问题&#xff1a;成功加载QWen2-1.5b模型&#xff0c;但是推理时 “model.generate( model_inputs.input_ids, top_pself.top_p, max_new_tokens512 )时”&#xff0c;报错“RuntimeError: …

【吊打面试官系列-Redis面试题】使用过 Redis 做异步队列么,你是怎么用的?

大家好&#xff0c;我是锋哥。今天分享关于【使用过 Redis 做异步队列么&#xff0c;你是怎么用的&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 使用过 Redis 做异步队列么&#xff0c;你是怎么用的&#xff1f; 一般使用 list 结构作为队列&#xff0c;rpus…

关系数据库(1,2)

目录 关系 域 笛卡尔集 元组 分量 基数 码 关系模式 关系模式的表示方式 关系数据库 基本关系操作 完整性 关系 单一的数据结构&#xff0c;二维表是一个逻辑结构&#xff0c;关系模型建立在集合代数的基础上。 域 指具有相同数据类型的集合。 笛卡尔集 笛卡尔集是…

pytorch快速入门(一)—— 基本工具及平台介绍

前言 该pytorch学习笔记应该配合b站小土堆的《pytorch深度学习快速入门教程》使用 环境配置&#xff1a;Anaconda Python编译器&#xff1a;pycharm、jupyter 两大法宝函数 dir&#xff08;&#xff09;&#xff1a;知道包中有什么东西&#xff08;函数 / 属性..…

YOLOv5:TensorRT模型加速与部署(wts版)

视频链接&#xff1a;YOLOv5&#xff1a;TensorRT模型加速与部署&#xff08;wts版&#xff09;_哔哩哔哩_bilibili 《YOLOv5&#xff1a;TensorRT模型加速与部署&#xff08;wts版&#xff09;》课程致力于帮助学生实战YOLOv5目标检测算法的TensorRT加速部署。常心老师将手把…

只需一键,AI Manga Translator 帮你解锁多国语言漫画

只需一键&#xff0c;AI Manga Translator 帮你解锁多国语言漫画 翻译漫画从未如此简单&#xff0c;AI Manga Translator Chrome 扩展程序让你只需点击几下&#xff0c;就能将生肉漫画翻译成你熟悉的语言。本文将带你了解这款工具的基本功能、使用方法&#xff0c;以及为什么你…

方案分享:我是怎么解决一个电力采集问题的?

一、整体解决方案 合宙DTU整体解决方案 DTU硬件&固件SIM卡业务云平台APP&小程序&web h5页面看板&#xff1b; 合宙提供的DTU整体解决方案&#xff0c;核心亮点如下&#xff1a; 品质有保障&#xff0c;硬件DTU固件经过市场上几千家的DTU客户长达5年时间的验证&…

音频芯片DP7344兼容CS4344低成本方案双通道24位DA转换器

产品简介 DP7344 是一款完整的 2 通道输出数模转换芯片&#xff0c;内含插值滤波器、Multi-Bit 数模转换器、输出模拟滤波器&#xff0c;并支持大部分的音频数据格式。 DP7344 基于一个带线性模拟低通滤波器的四阶 Multi-BitΔ∑调制器&#xff0c;自动检测信号频率和主时钟频率…

无人机飞手教员组装、调试高级教学详解

随着无人机技术的飞速发展&#xff0c;其在航拍、农业、救援、监测等多个领域的应用日益广泛&#xff0c;对专业无人机飞手的需求也随之增加。作为无人机飞手教员&#xff0c;掌握无人机的高级组装、调试技能不仅是教学的基础&#xff0c;更是培养学生成为行业精英的关键。本教…

C# System.BadImageFormatException问题及解决

C# System.BadImageFormatException问题 出现System.BadImageFormatException 异常有两种情况&#xff1a;程序目标平台不一致&引用dll文件的系统平台不一致。 异常参考 BadImageFormatException 程序目标平台不一致&#xff1a; 项目>属性>生成&#xff1a;x86 …

在 Java 中实现 Kafka Producer 的单例模式

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

【UE5】使用2DFlipbook图作为体积纹理,实现实时绘制体积纹理

这是一篇对“Creating a Volumetric Ray Marcher-Shader Bits”的学习心得 文章时间很早&#xff0c;因此这里针对UE5对原文做出兼容性修正&#xff08;为避免累赘不做出注明。链接如上&#xff0c;有需要自行学习&#xff09; 以及最后对Custom做可能的蓝图移植&#xff0c;做…

无人机在战争方面的应用!!!

01 侦察与监视 无人机能够进行长时间的侦察和监视&#xff0c;为指挥官提供实时的战场情报&#xff0c;是现代战争中不可或缺的“眼睛”。它们可以飞越敌方领空&#xff0c;收集情报&#xff0c;为军事决策提供关键信息。 02 精确打击 携带精确制导武器的无人机能够对敌方的…

Leetcode 516. 最长回文序列 区间dp C++实现

Leetcode 516. 最长回文序列 问题&#xff1a;给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 算法1&#xff1a…

检查一个复数C的实部a和虚部b是否都是有限数值即a和b都不是无限数值、空值cmath.isfinite(x)

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 检查一个复数C的实部a和虚部b 是否都是有限数值 即a和b都不是无限数值、空值 cmath.isfinite(x) [太阳]选择题 根据给定的Python代码&#xff0c;哪个选项是错误的&#xff1f; import cma…

Ubuntu 20.04 解决 nvidia-smi 出错问题

目录 一、初始问题 二、解决方法 2.1 法一 2.2 法二 三、新的问题 3.1 解决方案 3.2 进一步解决 3.3 最后解决 一、初始问题 今天要在本机上装个环境时&#xff0c;运行了一下 nvidia-smi 突然遇到一个问题&#xff1a; Failed to initialize NVML: Driver/library ver…

文件格式转换:EXCEL和CSV文件格式互相转换

目录 1.EXCEl和CSV文件格式互相转换1.1首先安装所需的Python包1.2excel转换为csv代码如下:1.3csv转换为excel代码如下:由于excel文件在数学建模数据处理当中的局限性,我们通常把excel文件转换为csv文件来处理,下面是相关的代码,我直接封装成函数,你们直接调用即可,我会添…

R语言进行无序多分类Logistic回归

在临床研究中&#xff0c;接触最多的是二分类数据&#xff0c;如淋巴癌是否转移&#xff0c;是否死亡&#xff0c;这些因变量最后都可以转换成二分类0与1的问题。然后建立二元logistic回归方程&#xff0c;可以得到影响因素的OR值。但有时我们也会接触到多分类结局数据&#xf…

C++:类和对象全解

C&#xff1a;类和对象全解 一、类的定义和初始化&#xff08;一&#xff09;类的定义1、类的成员变量&#xff08;1&#xff09;成员变量&#xff08;2&#xff09;成员函数 2、实例化对象&#xff08;1&#xff09;采用普通构造函数&#xff08;2&#xff09;采用初始化列表 …