postgresql数据库登录代理解析(包含登录协议包解析)

news/2024/7/9 23:26:21 标签: 数据库, postgresql, gauss, greenplum

文章目录

  • postgresql数据库登录代理解析(包含登录协议包解析)
    • 背景描述
    • 版本不同对应的账号密码加密
    • 目标
    • 解析方法
      • 相关代码位置
      • 断点关键位置及相关重要变量
    • 登录通信流程(SCRAM-SHA-256方式)
    • 代码实现
    • 相关参考资料

postgresql_1">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


http://www.niftyadmin.cn/n/1005861.html

相关文章

IDEA开发插件的相关参考

教程 用gradle开发IDEA插件_idea gradle插件_ykdsg的博客-CSDN博客 5分钟从零开发一款简易的IDEA插件 ※通过gradle开发idea插件,环境版本适配_wl1411956542的博客-CSDN博客 技术调研,IDEA 插件怎么开发「脚手架、低代码可视化编排、接口生成测试」&…

Python中os.listdir和os.walk(获取路径方法)的区别

在Python中,os.listdir() 和 os.walk() 是两种不同的方法来获取文件系统中的路径列表。 os.listdir():这个函数用来获取指定目录下的所有文件和文件夹的名称列表。它接受一个路径参数,返回该路径下的所有项目的名称(包括文件和文件…

C++primer(第五版)第六章(函数)

6.1函数基础 函数可以理解成是可以循环使用的代码块.函数的定义通常包含以下部分:返回类型,函数名称,参数列表,函数体. //以下是一个返回值为int类型,有两个参数的函数的定义 int add(int a,int b){return ab; }我们用调用运算符( )来执行函数,在运算符内传入参数.调用时会打…

spring.aop 随笔4 如何借助jdk代理类实现aop

0. 下了有一个月的雨,这对鼻炎来说来吗?不好 其实这也算6月份的博客,之前一直疏于整理 本文仅关注jdk代理所实现的spring.aop下,两者的关系完整的aop源码走读请移步相关 spring.aop 的其他随笔 1. 反编译追踪源码 1.1 jdk代理类…

从零开始 Spring Boot 53:JPA 属性转换器

从零开始 Spring Boot 53:JPA 属性转换器 图源:简书 (jianshu.com) 这篇文章介绍如何在 JPA(Hibernate)中使用属性转换器。 在前篇文章中,我介绍了如何使用Embedded和Embeddable将一个类型嵌入实体类,并映…

【软件测试】Java+selenium环境搭建

目录 1.下载Chrome浏览器,查看浏览器的版本 2.根据浏览器版本下载驱动 根据电脑版本下载驱动: 3.去maven仓库寻找selenium驱动 4.在idea中创建一个项目 1.在pom.xml中添加依赖 2.点击右侧刷新按钮 3.在Java下创建一个类Main 4.将以下代码写入 5.…

访问者模式(Vistor)

定义 访问者是一种行为设计模式,它能将算法与其所作用的对象隔离开来。 前言 1. 问题 假如你的团队开发了一款能够使用巨型图像中地理信息的应用程序。图像中的每个节点既能代表复杂实体(例如一座城市), 也能代表更精细的对象…

C++ 中的字符串类

历史遗留问题 C 语言不支持真正意义上的字符串 C 语言用字符数组和一组函数实现字符串操作 C 语言不支持自定义类型,因此无法获得字符串类型 解决方案 从 C 到 C 的进化过程引入了自定义类型 在 C 中可以通过类完成字符串类型的定义 问题: C 中的…