文章目录
- postgresql数据库登录代理解析(包含登录协议包解析)
- 背景描述
- 版本不同对应的账号密码加密
- 目标
- 解析方法
- 相关代码位置
- 断点关键位置及相关重要变量
- 登录通信流程(SCRAM-SHA-256方式)
- 代码实现
- 相关参考资料
postgresql数据库登录代理解析(包含登录协议包解析)
背景描述
需求:
在工作中需要实现一个对pgsql数据库进行代理的程序,能够通过自定义的用户名和密码登录pgsql。
实现:
代理程序已经实现,现在通过在客户端与数据库之间的代理程序,对客户端传输过来的自定义用户名密码进行解密或比对,再将真实数据库密码进行加密发送到服务器。
版本不同对应的账号密码加密
目标
由于md5加密方式过于简单,这里就不研究低版本的。如下流程都是分析的SCRAM-SHA-256方式,也就是PG14+(含14)版本
解析方法
利用jdbc连接pgsql,通过断点追踪用户名和密码,找到将用户名和密码发送连接地方。
相关代码位置
客户端发送到服务器的包
第一个包:
org.postgresql.core.v3.ConnectionFactoryImpl#enableSSL
第二个包:
org.postgresql.core.v3.ConnectionFactoryImpl#sendStartupPacket
第三个包:
org.postgresql.jre8.sasl.ScramAuthenticator#sendScramClientFirstMessage
org.postgresql.core.v3.ConnectionFactoryImpl#doAuthentication
第四个包:
org.postgresql.jre8.sasl.ScramAuthenticator#sendAuthenticationMessage
org.postgresql.jre8.sasl.ScramAuthenticator#processServerFirstMessage
断点关键位置及相关重要变量
经过如上协议包的交互过程及断点追踪,得到如下步骤及流程图。
登录通信流程(SCRAM-SHA-256方式)
.认证流程
1.客户端发送一个确认SSL是否开启的包
2.客户端发送一些参数(如用户名,数据库,客户端编码方式,数据风格,时区等)
3.服务器回一个SASL的认证机制,当前版本是SCRAM-SHA-256。
4.客户端根据服务器反的认证机制,创建ScramAuthenticator,初始化并构建SASL,包含认证方式和client_nonce认证数据发送给服务器。
5.服务器回应SASL continue(11)信号,发送s:盐、r: nonce、i: iteration,客户端根据它们生成serverFirstMessage对象。
6.客户端根据serverFirstMessage生成serverFirstProcessor,并获取clientFinalProcessor(这里面处理密码加密逻辑),然后根据clientFinalProcessor生成一个clientFinalMessage字符串。将其发送给服务器(类型为SASLResponse message)以及认证数据clientFinalMessage。
7.服务器返回SASL complete(12)标识,以及SASL authentication data数据,认证结束。
代码实现
略…
相关参考资料
https://www.postgresql.org/docs/current/sasl-authentication.html