PostgreSQL协议解析

发布时间 2023-06-30 09:44:37作者: 秋来叶黄

在访问pg数据库时,需要客户端按照规定的协议访问。所有的数据库都有一套自己的协议,所以可以开发各种语言对应的链接库,也可以根据协议自己开发一套。

startup 启动阶段

建立连接(三次握手)之后,肯定需要一个认证阶段,用来确保客户端有访问权限。pg有很多种认证方式,反正就是客户端提供认证信息(用户名密码等),服务端认证通过后会把服务端的一些信息(版本号等)发送到客户端。传输结束后,会发送一个结束消息,告诉客户端可以进行访问操作数据库了。

如果通信使用了ssl加密,在启动阶段也会体现出来,客户端会询问是否使用ssl加密,如果服务端回复是,那么就会进入交换密钥的过程,交换完成后,后续的通信会进行加密。ssl加密后,在网络上抓包获取的数据就无法解析了,因为ssl理论上是不可被破解的。

非对称加密

这里顺便说一下,为什么ssl加密后无法破解。ssl是非对称加密,除了非对称加密,还有对应的对称加密。主要区别就是原文用密钥加密后,是否可以用同一个密钥解密。加密解密是同一个密钥的是对称加密,不是的就是非对称加密。

ssl就是为了网络上传输的安全,在双方进行交互前,会交换各自的公钥,发给对方的数据用对方的公钥加密,加密过的内容用相同的公钥是无法解密的,必须要用对应的私钥。私钥都是在各自系统上的,并不会传播,所以就算获取到加密内容和公钥,同样是无法知道原数据是什么。

除了是否是对称加密外,加密算法还有一种分类就是是否可逆,md5就是一种不可逆的加密算法,加密得到的内容无法还原出原始内容,ssl就是一种可逆的算法,加密的密文是可以解密出来的。

查询阶段

在后续的操作数据库阶段,消息结构都是固定的,一个字节表示操作类型(查询,插入,删除等),四个字节表示数据长度(包括四个字节自己)。

|00|01|02|03|04|...|
|c |    len    |...|

比如下面这个,最常见的查询语句,从官网可以知道

Query (F)

    Byte1('Q')

        标识该消息是一个简单查询。 
    Int32

        以字节计的消息内容的长度,包括长度自身。 
    String

        查询字符串自身。 

根据官方协议介绍,就可以进行解析。

http://www.postgres.cn/docs/11/protocol.html
https://www.postgresql.org/docs/11/protocol.html