记录自己如何在没有协议文档的情况下,根据 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 批量插入协议实现一样,看一下客户端是怎么做的。
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 数据包的内容
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) {
// 省略部分代码...
}

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

被折叠的 条评论
为什么被折叠?



