MySQL登录验证的抓包-阿里云开发者社区

开发者社区> 数据库> 正文
登录阅读全文

MySQL登录验证的抓包

简介:

 理论知识部分摘录自:

http://blog.chinaunix.net/uid-9234131-id-5088292.html

http://blog.csdn.net/sissiyinxi/article/details/7660389

1.服务器端会随机生成一个random string发送给客户端;

 

2.客户端收到random string后,进行hash加密

     第一步,将密码hash,得到hashhash_stage1;  eg.hash_stage1=sha1("password");

     第二步,二次hash,得到hash_stage2;  eg. hash_stage2=sha1(hash_stage1);

     第三步,将密码二次hash得到的值与random string进行hash,得到hash_stage3; eg. hash_stage3=sha1("randomstring",hash_stage2);

     第四步,异或处理准备发送给服务器端,得到reply=xor(hash_stage1,hash_stage3);

     最后,将reply的值发送给服务器端。

 

3.服务器端收到reply后同样进行hash运算

    第一步,将保存的hash形式的密码hashpasswordrandom string进行hash,得到server_hash_stage1=sha1("randomstring","hashpassword");

    第二步,将客户端发送的reply与刚才得到的hash值进行异或运算,得到xor_value eg. xor_value=xor(reply,server_hash_stage1);

    第三步,将得到的异或值进行hash,得到server_hash_stage2 eg. server_hash_stage2=sha1(server_hash_stage1);

    第四步,验证,将最后得到的hashserver_hash_stage2与保存的密码hashpassword进行比较。eg.   server_hash_stage2==hashpassword,相等则验证通过。

 

伪代码如下:

SERVER:  public_seed=create_random_string()

         send(public_seed)

 

CLIENT:  recv(public_seed)

         hash_stage1=sha1("password")

         hash_stage2=sha1(hash_stage1)

         reply=xor(hash_stage1,sha1(public_seed,hash_stage2)

 

         // this three steps are done inscramble()

         send(reply)

 

SERVER:  recv(reply)

         hash_stage1=xor(reply,sha1(public_seed,hash_stage2))

         candidate_hash2=sha1(hash_stage1)

         check(candidate_hash2==hash_stage2)

         // this three steps are done incheck_scramble()

 

官方文档:

MySQL uses passwords in two phasesof client/server communication:

 

When a client attempts to connectto the server, there is an initial authentication step in which the client mustpresent a password that has a hash value matching the hash value stored in theuser table for the account the client wants to use.

 

After the client connects, it can(if it has sufficient privileges) set or change the password hash for accountslisted in the user table. The client can do this by using the PASSWORD()function to generate a password hash, or by using a password-generatingstatement (CREATE USER, GRANT, or SET PASSWORD).

 

 

> SELECT PASSWORD('Abcd@1234');   # mysql用户密码的计算方式:(hash方式)

+-------------------------------------------+

| PASSWORD('Abcd@1234')                     |

|-------------------------------------------|

|*47B150E012313114C04A1C9336709424085B6BD0 |

+-------------------------------------------+

 

 

使用wireshark抓取通过navicat登录虚拟机的mysql-5.7的部分截图:

wKioL1iv9b2g8NE6AACDo6iVsiQ601.png



5~7个包是三次握手包。

 

8个包:

wKioL1iv9b6jg0QwAAB-fiF67U8808.png


wKiom1iv9eSimzErAAAwc0KKE8k043.png

wKiom1iv9eSRo4W1AAAqV8mR9-U324.png


server告知客户端,当前服务器的字符集、认证使用的插件。并将随机生成的一个salt值发给client


9个包:

wKiom1iv9gKjSAqTAACpUVF7sjQ964.png


client端收到server端发来的salt值,然后使用salt值和本地的登录密码生成一个新的随机串,然后将新的串发往服务端(就是上图中的dd249f24....这串字符串)。服务端check字符串反解析。

 

 

10个包,是server-->client ACK包。

 

11个包开始及之后的一些packet就是client<---> server 之间的通讯了。

wKioL1iv9h_zniNEAABvoE6-J0E349.png

wKioL1iv9h_w7-MgAAAUlAJ2sAA563.png










本文转自 lirulei90 51CTO博客,原文链接:http://blog.51cto.com/lee90/1901000,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

其他文章
最新文章
相关文章