Apache ShardingSphere 是一款分布式 SQL 事务和查询引擎,可通过数据分片、弹性伸缩、加密等能力对任意数据库进行增强。

本文着重讲的是有关sharding-proxy,本质上与jdbc的区别在于透明化的数据库代理中间件 无代码侵入

更多说明性的可以查看官网。

简单实战:

项目源码下载之后,根据路径proxy-bootstrap----resource下

image

其中重点看 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这一列为明文:

image

此时连接代理端-也就是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'))))))

此时从原库中查看已经是密文,但是注意一点增量数据走代理会自动加密,但是存量数据需自己处理,使用相同的算法、密钥

image

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

image

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

最后修改:2026 年 06 月 06 日
如果觉得我的文章对你有用,请随意赞赏