mysql协议分析2---认证包

主人看到navicat和mysql在那嘻嘻哈哈,眉来眼去的,好不快乐,忽然也想自己写个程序,直接去访问Mysql,虽然现在已经有很多现成的中间件可以直接拿来用了,程序只要负责写sql语句就行了,但是主人想要自己通过mysql协议直接和mysql通讯,一窥究竟。于是主人找到Mysql说:亲爱的mysql,我以前和你交流总要通过第三方的驱动在中间传话,总感觉我们之间还有一个隔阂,有些话也不方便说,我现在有些心里话想直接和你交流。。。你说行吗?

mysql说:当然行啊,mysql受宠若惊,要和我打交道有多种方法比如:TCP/IP,TLS/SSL,Unix Sockets,Shared Memory,Named pipes等,那我们就用TCP/IP的方吧。用tcp协议就绕不开三次握手连接和四次握手断开,所以呢你和我连接的第一件事就是三次握手连接。

主人尴尬的笑了笑,tcp的三次握手听到听说过很多次,但是从没有真正的理解。。。

mysql从身后丢过来一个便签:这里有篇文章可以参考下:https://www.cnblogs.com/zhanyd/p/9877762.html

主人谢道,还是你体贴,刚开始navicat和你连接的时候,我是输入了主机地址,用户名,密码的,你们之间是怎么验证的呢?

mysql说:好问题,所有的客户端和我连接首先都要先经过我的认证,我和客户端一次正常的交互过程如下:

1. 三次握手建立 TCP 连接。

2. 建立 MySQL 连接,也就是认证阶段。
    服务端 -> 客户端:发送握手初始化包 (Handshake Initialization Packet)。
    客户端 -> 服务端:发送验证包 (Client Authentication Packet)。
    服务端 -> 客户端:认证结果消息。

3. 认证通过之后,客户端开始与服务端之间交互,也就是命令执行阶段。
    客户端 -> 服务端:发送命令包 (Command Packet)。
    服务端 -> 客户端:发送回应包 (OK Packet, or Error Packet, or Result Set Packet)。

4. 断开 MySQL 连接。
    客户端 -> 服务器:发送退出命令包。

5. 四次握手断开 TCP 连接。

我专门搞了个认证报文格式,我会按照以下的格式给客户端发送数据,然后客户端要根据这里面的内容给我返回验证包,然后我判断是否有权限登录:

官方的文档是这样子滴:

感觉不直观,在网上找到一个更直观的图:

具体解释如下:

  • protocol_version (1) -- 0x0a protocol_version

    第一个字节表示协议版本号

  • server_version (string.NUL) -- human-readable server version

    服务器版本号,字符串遇到Null结束

  • connection_id (4) -- connection id

    服务器线程id

  • auth_plugin_data_part_1 (string.fix_len) -- [len=8] first 8 bytes of the auth-plugin data

    第一部分8个字节的挑战随机数,后面还有第二部分

  • filler_1 (1) -- 0x00

    填充位0x00

  • capability_flag_1 (2) -- lower 2 bytes of the Protocol::CapabilityFlags (optional)

    服务器权能标志(低位2个字节)

  • character_set (1) -- default server character-set, only the lower 8-bits Protocol::CharacterSet (optional)

    This “character set” value is really a collation ID but implies the character set; see the Protocol::CharacterSet description.

    字符编码

  • status_flags (2) -- Protocol::StatusFlags (optional)

    服务器状态

  • capability_flags_2 (2) -- upper 2 bytes of the Protocol::CapabilityFlags

    服务器权能标志(高位2个字节)

  • auth_plugin_data_len (1) -- length of the combined auth_plugin_data, if auth_plugin_data_len is > 0

    挑战随机数的长度

  • string[10]     reserved (all [00])

    10个字节的保留位,都是00

  • auth_plugin_data_part_2

    挑战随机数的第二部分,通常是12字节

  • 挑战随机数结束标志00
  • auth_plugin_name (string.NUL) -- name of the auth_method that the auth_plugin_data belongs to

认证插件的名称,null结尾(这部分上面的图表里没有加进去)

主人听完后,跃跃欲试,很想验证下Mysql说的是不是真的,于是他找到了密友Wiresshark,让他监听下navicat和mysql之间的认证包,Wiresshark很快就完成了任务,把结果呈上来了:

具体先看服务器发送过来的第一个包:

主人一看,居然和mysql说的一模一样,好神奇。。。

mysql笑道:那当然,我还能骗你不成。我发给客户端收到后,客户端就要返回认证包给我验证啦,是驴是马我一眼就能认出来了哦,客户端返回给我要遵循以下的格式:

Fields

  • capability_flags (4) -- capability flags of the client as defined in Protocol::CapabilityFlags

    客户端权能标志

  • max_packet_size (4) -- max size of a command packet that the client wants to send to the server

    报文的最大字节数

  • character_set (1) -- connection‘s default character set as defined in Protocol::CharacterSet.

    字符集编码

  • username (string.fix_len) -- name of the SQL account which client wants to log in -- this string should be interpreted using the character set indicated by character set field.

    用户名

  • auth-response (string.NUL) -- opaque authentication response data generated by Authentication Method indicated by the plugin name field

    用户认证信息,即密码明文和挑战随机数加密后的token

  • database (string.NUL) -- initail database for the connection -- this string should be interpreted using the character set indicated by character set field.

    数据库名称

  • auth plugin name (string.NUL) -- the Authentication Method used by the client to generate auth-response value in this packet. This is an UTF-8 string.

    认证方法

主人抓包的结果:

mysql收到了主人发过来的认证包:主人,经过验证用户名密码都是正确的,可以登录了,我要返回一个ok报文,告诉你操作成功了哦,报文结构如下:

  • header:

    OK: header = 0 and length of packet > 7

    header=0并且报文长度>7表示当前是ok报文

    EOF: header = 0xfe and length of packet < 9

    header=0xfe并且报文长度<9表示当前是eof报文

主人抓包的结果:

header = 0,表示这个是个ok报文,status_flags(server status)= 02表名设置自动提交成功。

 

主人很高兴:这是不是说明,我和你的连接成功了呀?

mysql:恭喜你连接成功了,我们走出了第一步,接下来你就可以发送命令让我执行了哟。

原文地址:https://www.cnblogs.com/zhanyd/p/9895241.html

时间: 2024-10-14 01:30:25

mysql协议分析2---认证包的相关文章

MySQL协议分析2

MySQL协议分析 议程 协议头 协议类型 网络协议相关函数 NET缓冲 VIO缓冲 MySQL API 协议头 ● 数据变成在网络里传输的数据,需要额外的在头部添加4 个字节的包头. . packet length(3字节), 包体的长度 . packet number(1字节), 从0开始的递增的 ● sql “select 1” 的网络协议是? 协议头 ● packet length三个字节意味着MySQL packet最大16M大于16M则被分包(net_write_command, m

mysql协议分析

参考资料: http://dev.mysql.com/doc/internals/en/client-server-protocol.html http://www.haodaima.net/art/2574673 http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#11 http://blog.csdn.net/gapaul/article/details/12046843 mysql起始握手,先由server发起,client

mysql 协议的FieldList命令包及解析

git https://github.com/sea-boat/mysql-protocol 概况 当mysql客户端使用show column命令时即对应这个FieldList命令包. mysql通信报文结构 类型 名字 描述 int<3> payload长度 按照the least significant byte first存储,3个字节的payload和1个字节的序列号组合成报文头 int<1> 序列号 string payload 报文体,长度即为前面指定的payload

usb协议分析-设备描述符配置包-描述符

/* usb协议分析仅供大家参考---设备描述符配置包,设备描述符, 地址设置, 配置描述符, 字符串描述符 */ /* -1- usb设备描述符配置包 */ typedef struct _USB_SETUP_PACKET { REQUEST_TYPE bmRequestType; BYTE bRequest; WORD_BYTE wValue; WORD_BYTE wIndex; WORD wLength; } USB_SETUP_PACKET; 1.bmRequestType 是包含有下面

wireshark tcp 协议分析

  虽然知道wireshark是抓包神器,只会大概大概用一下,还用一下下tcpdump,略懂一点BPF过滤器,也知道一点怎么用wirkshark过滤相关的报文,但是对于详细的字段的含义,如何查看TCP的交互情况还不是非常的了解.现在,简单分析一下.PS:这次抓包的对象是传说中通过公安局多少多少级认证的本公司开发的交易系统,本来看到他的验证码倾斜的很有规律,叫的斑斑点点也不是很密集.就想写个小程序练习一下验证码识别,可是我失望了,在wireshark里面居然没有抓到任何报文,这个东西的验证码居然是

NetAnalyzer笔记 之 二. 简单的协议分析

[创建时间:2015-08-27 22:15:17] NetAnalyzer下载地址 上篇我们回顾完了NetAnalyzer一些可有可无的历史,在本篇,我决定先不对NetAnalyzer做介绍,而是先要了解一些关于构建NetAnalyzer的基础知识,如系统中可以分析的一些网络协议,了解它们的分布方式,字段含义等.在了解了协议的基础上,开始对Winpcap进行一些介绍,在这过程中,学习配置Winpcap的开发环境,做一些简单的数据采集程序.第三部分着重介绍过滤表达式的一些基本语法结构.写下来则要

SMTP协议分析

SMTP协议分析 第1章.     SMTP概述 1.1.  SMTP在邮件通信中的位置 SMTP,即简单邮件传送协议,所相应RFC文档为RFC821.同http等多数应用层协议一样,它工作在C/S模式下,用来实现因特网上的邮件传送.SMTP在整个电子邮件通信中所处的位置如图 1所看到的. 图 1电子邮件的通信过程 能够看出,SMTP是用来将客户机上的邮件传送到server上.这里的客户机是指某次连接中的发送方,server是指对应的接收方.在解说发送邮件的整个通信过程前,先解释一以下几个术语.

wireshark tcp 协议分析 z

虽然知道wireshark是抓包神器,只会大概大概用一下,还用一下下tcpdump,略懂一点BPF过滤器,也知道一点怎么用 wirkshark过滤相关的报文,但是对于详细的字段的含义,如何查看TCP的交互情况还不是非常的了解.现在,简单分析一下.PS:这次抓包的对象是 传说中通过公安局多少多少级认证的本公司开发的交易系统,本来看到他的验证码倾斜的很有规律,叫的斑斑点点也不是很密集.就想写个小程序练习一下验证码识 别,可是我失望了,在wireshark里面居然没有抓到任何报文,这个东西的验证码居然

[转载] TLS协议分析 与 现代加密通信协议设计

https://blog.helong.info/blog/2015/09/06/tls-protocol-analysis-and-crypto-protocol-design/?from=timeline&isappinstalled=0 最近发现密码学很有意思,刚好还和工作有点关系,就研究了一下,本文是其中一部分笔记和一些思考. 密码学理论艰深,概念繁多,本人知识水平有限,错误难免,如果您发现错误,请务必指出,非常感谢! 本文禁止转载 本文目标: 学习鉴赏TLS协议的设计,透彻理解原理和重