• MySQL客户端与服务端建立连接抓包分析


    MySQL客户端与服务端建立连接流程抓包分析

    抓包工具采用的是Wiresharkmysql客户端使用的是java操作jdbc连接mysql。

    1.连接建立流程

    在这里插入图片描述

    1. 服务端向客户端发送挑战数据包
    2. 客户端向服务端发送认证数据包
    3. 如果认证失败,则需要切换认证插件(更换加密算法),服务端会返回切换认证插件的请求数据包,客户端会重新加密密码,发送切换认证插件的响应数据包
    4. 服务端返回成功或失败数据包

    2.各类数据包介绍

    2.1挑战数据包

    mysql采用的是挑战-响应方式来进行身份认证。由服务端生成加密用的盐给客户端,提高安全性

    在这里插入图片描述

    数据包携带的信息如下:

    名称类型长度描述
    Protocolint1个字节协议的版本号
    Versionstring不确定mysql的版本
    Thread IDint4个字节建立连接所分配的id
    Saltstring20个字节 8+12挑战字符串,相当于用于加密密码的盐,分为两部分,长度分别为8字节和12字节
    Server Capabilitiesint2个字节服务器支持的功能,int为32位,1支持,0不支持,最多支持32种功能。这里占2个字节,为int的前16位
    Server Languageint1个字节服务器编码,通常为utf8mb4
    Server Statusint2个字节服务器状态,通常为SERVER_STATUS_AUTOCOMMIT,表示自动提交事务
    Extended Server Capabilitiesint2个字节服务器支持的拓展功能,int为32位,1支持,0不支持,最多支持32种功能。这里占2个字节,为int的后16位
    Authentication Plugin Lengthint1个字节?好像指的是挑战字符串的长度,没搞懂为什么是21而不是20
    Unused10个字节未使用的部分
    Authentication Pluginstring不确定密码采用的加密方法,通常为mysql_native_password
    2.2认证数据包

    接收到服务端的挑战数据包后,客户端需要发送认证信息给服务端用于校验

    在这里插入图片描述

    数据包携带的信息如下:

    名称类型长度描述
    Client Capabilitiesint2个字节客户端支持的功能,类似Server Capabilities
    Extended Client Capabilitiesint2个字节客户端支持的拓展功能,类似客户端支持的功能,类似Extended Server Capabilities
    MAX Packetint4个字节最大的数据包大小
    Charsetint1个字节客户端编码
    Unused23个字节未使用的部分
    Usernamestring不确定登录的用户名
    Passwordstring不确定登录的密码,已加密
    Schemastring不确定连接的库
    Client Auth Pluginstring不确定认证使用的插件,即采用的哪种密码加密算法
    Connection Attributes不确定客户端的相关参数,键值对的形式。包括客户端版本、客户端名称等
    2.3切换认证插件请求数据包

    如果挑战数据包返回的Authentication Plugin认证插件与你的用户密码加密方式不一致(比如你的用户采用的是mysql_native_password加密,而服务器返回的是caching_sha2_password),那么校验肯定失败,所以需要更换加密方式。服务器会发送一个切换认证插件请求数据包来指示客户端重新加密密码并发送。

    在这里插入图片描述

    数据包携带的信息如下:

    名称类型长度描述
    Response Codeint1个字节响应状态码 0xfe表示结果集结束
    Auth Method Namestring不确定要切换的认证插件
    Auth Method Datastring20个字节挑战数据,盐,用于重新加密
    2.4切换认证插件响应数据包

    客户端采用新的加密算法后,将密码再发送给服务端

    在这里插入图片描述

    数据包携带的信息如下:

    名称类型长度描述
    Auth Method Datastring20个字节采用新的认证插件加密后的密码
    2.5成功数据包

    在这里插入图片描述

    数据包携带的信息如下:

    名称类型长度描述
    Response Codeint1个字节响应状态码,0x00代表操作成功
    Affected Rowsint不确定影响的行数,通常在操作数据时才有值
    Server Statusint2个字节服务器状态,0x0002代表自动提交
    warningsint2个字节服务器产生的警告次数
    2.6失败数据包

    测试:使用错误的密码连接MySQL

    在这里插入图片描述

    数据包携带的信息如下:

    名称类型长度描述
    Response Codeint1个字节响应状态码,0xff代表操作失败
    Error Codeint2个字节错误码,1045表示访问被拒绝
    SQL statestring5个字节sql状态,28000表示认证失败
    Error messagestring不确定错误提示信息

    3.注意点

    1. 如果连接参数使用了SSL(useSSL=true),认证将会使用TLS/SSL对数据进行加密,客户端和服务端后续都会采用TSL数据包来进行数据发送

    2. 如果挑战数据包返回的密码加密方法与用户的密码加密方法不匹配,那么认证不会直接成功,服务端会发送一个Auth Switch Request数据包(指定了应该使用哪种加密算法)来提醒用户更改加密算法,用户则发送一个Auth Switch Response数据包来发送重新加密后的密码。

      常用的加密方法有caching_sha2_passwordmysql_native_password。通过修改mysql默认的认证插件可以指定挑战数据包返回的密码加密方式default_authentication_plugin=mysql_native_password
      在这里插入图片描述

    4.测试代码

    public static void main(String[] args) throws SQLException {
        Connection c = DriverManager.getConnection("jdbc:mysql://192.168.86.111:3306/test?useSSL=false", "root", "123456");
        Statement s = c.createStatement();
        ResultSet rs = s.executeQuery("show variables like 'datadir'");
        if (rs.next())
            System.out.println(rs.getString(2));
    }
    
  • 相关阅读:
    Leetcode 【1334. 阈值距离内邻居最少的城市】
    linux驱动开发:驱动中的并发控制
    【Linux命令】vim 多模式编辑
    【Java 进阶篇】JavaScript二元运算符详解
    Docker 镜像源配置
    部分排序算法讲解
    火山引擎 LAS Spark 升级:揭秘 Bucket 优化技术
    【AGC】更新应用信息报未知错误解决方法
    Docker Swarm总结
    【实战】流动的箭头 —— 线性流动组件(repeating-linear-gradient,@keyFrames)
  • 原文地址:https://blog.csdn.net/pyf2533931995/article/details/139824172