没文档也要扒源码让 ShardingSphere 支持 openGauss SCRAM 前端认证

本文详述了在缺乏官方协议文档的情况下,通过阅读openGaussJDBCDriver源码,实现ShardingSphere openGauss Proxy对openGauss的SCRAM SHA-256前端认证的支持。从确定认证方式枚举值、解析数据包内容到调整校验逻辑,最终通过不同客户端验证实现的正确性,整个过程充满挑战与学习。

记录自己如何在没有协议文档的情况下,根据 openGauss JDBC Driver 源码,让 ShardingSphere openGauss Proxy 支持 openGauss 的 SCRAM SHA-256 前端认证机制。

前言

目标:让 ShardingSphere openGauss Proxy 支持以 SCRAM SHA-256 机制验证 openGauss 客户端的身份。

最近在做一个和 ShardingSphere Proxy openGauss 前端认证方式相关的 issue ShardingSphere openGauss Proxy supports sha256 authentication method #13995
PostgreSQL 有一种前端认证方式是 MD5 Password。客户端根据服务端提供的 salt 对密码进行 MD5 加密并发送,完成认证过程。
openGauss 觉得 MD5 不安全,前端认证推荐并默认使用 SHA-256
虽然说是 SHA-256 认证,听起来就是与 PostgreSQL 的 MD5 认证大同小异,只是摘要的长度不一样,后来做起来才发现完全不是这样。openGauss 用的是 SCRAM,其中的哈希算法可以使用 SHA-256 或者国密算法。
在做这个 issue 之前,我不了解 SCRAM,其他安全相关知识也了解不深,实现过程也是费了一些心思。

环境准备

openGauss 数据库与客户端

本文所使用的 openGauss 数据库及 gsql (前身就是 psql)均使用 Docker Image enmotech/opengauss:2.1.0

openGauss JDBC Driver 使用 org.opengauss:opengauss-jdbc:2.0.1-compatibility

<dependency>
    <groupId>org.opengauss</groupId>
    <artifactId>opengauss-jdbc</artifactId>
    <version>2.0.1-compatibility</version>
</dependency>

openGauss 服务端配置

enmotech/opengauss:2.1.0 默认使用了 MD5 认证方式,需要修改各项配置为 sha256 并新建用户。

postgresql.conf 需要配置:

password_encryption_type = 2

pg_hba.conf 需要配置:

host all all 0.0.0.0/0 sha256

配置完成后需要重启或执行 gs_ctl reload 生效。

最后创建一个新用户:

CREATE USER wuweijie PASSWORD 'Wuweijie@123';

没有文档?扒源码去扒一下客户端源码看看是怎么做的。

确定 SHA-256 认证方式的枚举值

openGauss 不像 PostgreSQL 那样有比较完善的协议文档,包括本次要做的 SCRAM SHA-256 前端认证,openGauss 官网也只有配置相关的说明,如何实现没有指导文档。
没有文档怎么办?就像之前实现 openGauss 批量插入协议实现一样,看一下客户端是怎么做的。

https://gitee.com/opengauss/openGauss-connector-jdbc/blob/master/pgjdbc/src/main/java/org/postgresql/core/v3/ConnectionFactoryImpl.java#L63

  private static final int AUTH_REQ_MD5 = 5;
  // 省略部分代码...
  private static final int AUTH_REQ_SHA256 = 10;

PostgreSQL MD5 认证方式的枚举值为 5,openGauss 所增加的 SHA-256 认证方式枚举值为 10。

确定 Auth Request 数据包的内容

https://gitee.com/opengauss/openGauss-connector-jdbc/blob/master/pgjdbc/src/main/java/org/postgresql/core/v3/ConnectionFactoryImpl.java#L668

openGauss JDBC Driver 认证相关关键逻辑节选及本文注释说明:

              case AUTH_REQ_SHA256: {
   
   
                  // 省略部分代码...
                  byte[] digest;
                  int passwordStoredMethod = pgStream.receiveInteger4();
                  // 省略部分代码...
                  if (passwordStoredMethod == PLAIN_PASSWORD || passwordStoredMethod == SHA256_PASSWORD) {
   
   
                      String random64code = pgStream.receiveString(64);
                      String token = pgStream.receiveString(8);
                      byte[] result = null;
                      // 由于 openGauss 最新的客户端都使用 3.51 的协议版本,以下分支只需关心最后的 else
                      if (this.protocolVerion < PROTOCOL_VERSION_350) {
   
   
						  // 省略部分代码...
                      } else if (this.protocolVerion == PROTOCOL_VERSION_350) {
   
   
						  // 省略部分代码...
                      } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wuweijie@apache.org

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值