Apache ShardingSphere 是一款分布式 SQL 事务和查询引擎,可通过数据分片、弹性伸缩、加密等能力对任意数据库进行增强。
本文着重讲的是有关sharding-proxy,本质上与jdbc的区别在于透明化的数据库代理中间件 无代码侵入
更多说明性的可以查看官网。
简单实战:
项目源码下载之后,根据路径proxy-bootstrap----resource下

其中重点看 config-encrypt.yaml
#如对pg数据库进行代理
databaseName: postgres
dataSources:
5e869ce2cf334acc8687bf21dfb51d34:
url: jdbc:postgresql://xxxx:5432/postgres
username: xxxx
password: xxxx
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
rules:
- !ENCRYPT
encryptors:
#加密算法标签自定义
test_col1:
props:
sm4-mode: ECB
# 密钥
sm4-key: a5731fb991a6f45b8b5fe45d43fc3a81
sm4-padding: PKCS5Padding
# 源码中的算法标识,后面会讲到
type: MySm4
queryWithCipherColumn: true
tables:
#表名
test:
columns:
#字段名
col1:
cipherColumn: col1
encryptorName: test_col1
logicColumn: col1
name: test项目启动起来之后,可以使用navicat等可视化工具进行连接,支持的连接工具 可以查看官网。
目前原库中的数据t5这一列为明文:

此时连接代理端-也就是sharding-proxy,navicat连接,之后执行一条语句distsql,它是sharding专门用于动态更新配置的一个语法,实现不用停机更新,比如对t5列加密,之后想对t6加密,不用停机 只需执行distsql即可。
ALTER ENCRYPT RULE t14 (COLUMNS((NAME=t5,CIPHER=t5,ENCRYPT_ALGORITHM(TYPE(NAME='MySm4',PROPERTIES('sm4-key'='a4311fa82f52d513f43a79a281c86ec1','sm4-mode'='ECB','sm4-padding'='PKCS5Padding')))),(NAME=int4_cs,CIPHER=int4_cs,ENCRYPT_ALGORITHM(TYPE(NAME='MySm4',PROPERTIES('sm4-key'='a4311fa82f52d513f43a79a281c86ec1','sm4-mode'='ECB','sm4-padding'='PKCS5Padding'))))))此时从原库中查看已经是密文,但是注意一点增量数据走代理会自动加密,但是存量数据需自己处理,使用相同的算法、密钥

从代理这边看到的是明文,proxy 根据rule进行了解密

目前sharding-proxy这种透明化的方式并不需要修改代码,对于老项目的维护或者是在线项目,想要实现数据安全是一个很好的方式