55 mysql 的登录认证流程

news2024/9/29 13:21:47

前言

这里我们来看一下 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 {

    // Test09MysqlLoginEncrypt
    public 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);
        }

        @Override
        public String getPasswordCharacterEncoding() {
            return "UTF-8";
        }
    }

}

 

运行处理, 信息如下 

8decf59dbd830698990ae6a8e1658f78.png

 

 

完 

 

 

 

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

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

相关文章

MySQL权限控制(DCL)

我的mysql里面的一些数据库和一些表 基本语法 1.查询权限 show grants for 用户名主机名;例子1&#xff1a;查询权限 show grants for heima%;2.授予权限 grant 权限列表 on 数据库名.表名 to 用户名主机名;例子2&#xff1a; 授予权限 grant all on itcast.* to heima%;…

<<编码>>第 12 章 二进制加法器--二进制加法器 示例电路

info::操作说明 鼠标单击逻辑输入切换 0|1 状态 另: 因节点较多, 为避免过多连线, 此处采用标签虚拟连接方式, 相同的标识符表示连接在一起 关于标签虚拟连接的介绍见该链接: https://book.xiaogd.net/usage-of-circuitjs/circuitjs-label-simplify-circuit.html primary::在线…

《订单来了2024中秋预订趋势报告》发布:截至9月13日,商家中秋预订率上涨42.73%,山西文化巡礼成顶流

# 截至9月13日&#xff0c;订单来了酒店民宿已突破16万&#xff0c;商家中秋假期平均预订率较9月8日上涨42.73%。 对比6天前&#xff0c;酒店商家中秋平均预订率增长38.85%&#xff0c;民宿商家增长38.10%。 1%的酒店民宿达成「连续3天满房」成就&#xff0c;4%商家预订率超…

terminator-gnome

gnome import os#启动节点指令变量 stere"ros2 launch stereo_c start.py" utils"ros2 launch task utils.launch.py" #tab标题 stere_title"stere_driver" utils_title"utils"#一个终端界面打开5个tab cmd1f"gnome-terminal --…

嵌入式软件黑盒测试技术与案例分析培训

黑盒测试&#xff0c;也称为基于需求的测试&#xff0c;是目前嵌入式软件领域普遍开展的一种测试过程。目前&#xff0c;随着人们对软件质量要求的不断提升&#xff0c;行业对软件测试和验证的要求也在不断提高&#xff0c;对测试的充分性和准确性要求越来越苛刻。当前行业内&a…

工作流技术(WorkFlow)

什么是工作流 1.使用编程语言完成一套固定的审批流程 例如请假审批流程 订单配送流程 入职&#xff0c;辞职审批流程 2.使用场景 业务类&#xff1a;合同审批流程、订单处理流程、出入库审批流程等。 行政类&#xff1a;请假流程、出差流程、用车流程、办公用品申请流程…

代理IP设置后IP不变?可能的原因及解决方法

在使用代理IP时&#xff0c;有时会遇到代理设置后IP地址却没有变化的情况。这种问题可能会让人感到困惑&#xff0c;但其实背后有多种原因。本文将详细探讨这些原因&#xff0c;并提供相应的解决方法&#xff0c;帮助你顺利解决问题。 可能的原因 代理IP设置后IP地址不变的原…

智慧人居视音频解决方案探究和技术实现

智慧人居技术背景 智慧人居是一种利用先进技术和智能化系统&#xff0c;旨在提升居住环境的舒适性、便捷性和安全性的新型居住模式。随着物联网、大数据、人工智能等技术的不断发展&#xff0c;智慧人居正朝着更加智能化、个性化、集成化的方向发展。 智慧人居通过集成各种智…

【数据结构与算法 | 灵神题单 | 合并链表篇】力扣2, 21, 445, 2816

1. 力扣2&#xff1a;两数相加 1.1 题目&#xff1a; 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可…

房产销售系统:SpringBoot技术应用案例

第二章关键技术的研究 2.1相关技术 房产销售系统是在Java MySQL开发环境的基础上开发的。Java是一种服务器端脚本语言&#xff0c;易于学习&#xff0c;实用且面向用户。全球超过35&#xff05;的Java驱动的互联网站点使用Java。MySQL是一个数据库管理系统&#xff0c;因为它的…

Blender/3ds Max/C4D哪个软件好?

在3D建模和动画制作领域&#xff0c;Blender、3ds Max和Cinema 4D&#xff08;C4D&#xff09;都是备受赞誉的软件。每个软件都有其独特的优势和特点&#xff0c;选择哪个软件取决于用户的具体需求和个人偏好。今天&#xff0c;成都渲染101云渲染就来分析一些这三款软件的情况&…

滑动窗口算法—最小覆盖子串

题目 ”最小覆盖子串“问题&#xff0c;难度为Hard&#xff0c;题目如下&#xff1a; 给你两个字符串 S 和 T&#xff0c;请你在 S 中找到包含 T 中全部字母的最短子串。如果 S 中没有这样一个子串&#xff0c;则算法返回空串&#xff0c;如果存在这样一个子串&#xff0c;则可…

GANs-生成对抗网络

参考&#xff1a; https://mp.weixin.qq.com/s?__bizMjM5ODIwNjEzNQ&mid2649887403&idx3&snf61fc0e238ffbc56a7f1249b93c20690&chksmbfa0f632460e035f00be6cc6eb09637d91614e4c31da9ff47077ca468caad1ee27d08c04ca32&scene27 https://cloud.tencent.com…

pywinauto install ~

1. 下载最新的python, Download Python | Python.org 博主用的版本是&#xff1a; python-3.12.6-amd64.exe 2. 安装python. (略) 3. 配置环境变量&#xff1a; 点击环境变量&#xff0c;并编辑PATH变量&#xff0c; 后面3条是新加的。 4. 安装pywinauto, 打开CMD输入 pip …

转置卷积与反卷积的区分

transposed convolution&#xff08;转置卷积&#xff09;和deconvolution&#xff08;反卷积&#xff09;是两个完全不同的概念。 deconvolution为“inverse of convolution”、“inverse filter”&#xff0c;翻译为反卷积、解卷积。在信号处理中&#xff0c;反卷积是指从卷积…

一家电子元件企业终止,业绩规模小,疑似通过收购调节收入利润

贝特电子终止原因如下&#xff1a;首先&#xff0c;报告期内贝特电子营收较低&#xff0c;收购东莞博钺股权可能构成重大资产重组&#xff0c;且假如扣除报告期内来自东莞博钺的净利润&#xff0c;贝特电子的净利润恐怕不符合深交所上市标准&#xff1b;其次&#xff0c;交易所…

彩漩科技亮相第一届人工智能教育应用论坛,入选TOP30榜单,展示创新教育科技产品

近日&#xff0c;由中国教育发展战略学会人工智能与机器人教育专业委员会指导&#xff0c;北京教育信息化产业联盟主办的第一届人工智能教育应用论坛暨 AI 教育科技成果展在北京隆重举办。本次活动以“AI 强校大时代 —— 用新质生产力打造金钥匙强校”为主题&#xff0c;汇聚了…

C++速通LeetCode简单第12题-二叉树的直径

递归&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}…

链表的快速排序(C/C++实现)

一、前言 大家在做需要排名的项目的时候&#xff0c;需要把各种数据从高到低排序。如果用的快速排序的话&#xff0c;处理数组是十分简单的。因为数组的存储空间的连续的&#xff0c;可以通过下标就可以简单的实现。但如果是链表的话&#xff0c;内存地址是随机分配的&#xf…

并发控制全解析

在数据库操作中&#xff0c;并发控制 是确保数据一致性和事务隔离性的关键。然而&#xff0c;多个事务的并发操作可能导致数据不一致&#xff0c;破坏数据库的ACID特性。本文将深入探讨并发操作可能带来的问题&#xff0c;并介绍常见的并发控制技术。 1. 并发操作带来的挑战 …