一、Sharding Sphere基本介绍
官网链接推荐:跳转官网 | 5.0.0中文文档 | 数据加密介绍
二、环境准备
-- auto-generated definition
create table t_user
(
user_id varchar(32) not null comment '用户id'
primary key,
user_name varchar(255) null comment '用户名称',
password_show varchar(255) null comment '密码明文',
password_encrypt varchar(255) null comment '密码密文',
password_assisted varchar(255) null comment '辅助查询列'
)
comment 'Sharding Sphere数据加密测试' collate = utf8mb4_bin;
三、Spring Boot整合Sharding Sphere Jdbc实现数据加密
1、引入pom.xml依赖
<!--sharding-jdbc-->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
<version>5.0.0</version>
</dependency>
2、application.yml配置文件
# ShardingSphere 数据加密
spring:
shardingsphere:
datasource:
# 数据源
names: master
# 主库
master:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:7000/cyun_sharding_sphere?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: root
type: com.zaxxer.hikari.HikariDataSource
# 使用模式,支持三种模式:内存模式、单机模式、集群模式
mode:
type: Memory
props:
# 打印sql
sql-show: true
query:
with:
cipher:
column: true
rules:
# 数据加密
encrypt:
# 加密算法配置
encryptors:
# 注意:此处命名不能使用“_”,否则启动报错
password-encryptor:
# 加密算法属性配置
props:
aes-key-value: 123456abc
# 加密算法类型
type: AES
tables:
t_user:
columns:
password_encrypt:
# # 加密列名称
cipher-column: password_encrypt
# 查询列名称
# assisted-query-column: password_assisted
# 原文列名称
plain-column: password_show
# 加密算法名称
encryptor-name: password-encryptor
# 是否使用加密列进行查询。在有原文列的情况下,可以使用原文列进行查询
queryWithCipherColumn: true
3、测试类
package com.cyun.demo.sharding.sphere.encryption.controller;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.cyun.core.result.ResultVO;
import com.cyun.demo.sharding.sphere.encryption.entity.User;
import com.cyun.demo.sharding.sphere.encryption.service.impl.UserServiceImpl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 数据加密测试类
*
* @author He PanFu
* @date 2022-04-20 11:39:11
*/
@Slf4j
@RestController
@RequestMapping("/test")
@RequiredArgsConstructor
public class TestController {
private final UserServiceImpl userService;
@GetMapping(value = "/list")
public ResultVO list() {
final List list = userService.list();
return ResultVO.ok(list.size());
}
@GetMapping(value = "/add")
public ResultVO add() {
User userEntity = new User();
userEntity.setUserId(IdWorker.getIdStr());
userEntity.setUserName("user19");
// 加密字段
userEntity.setPasswordEncrypt("123456");
userService.save(userEntity);
return ResultVO.ok();
}
}
4、控制台日志
新增
查询
四、SPI自定义加密算法
1、官网文档提供SPI
2、创建自定义加密算法Sha256Encryptor实现EncryptAlgorithm
package com.cyun.demo.sharding.sphere.encryption.config;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.shardingsphere.encrypt.spi.EncryptAlgorithm;
/**
* 自定义数据加密策略
*
* @author He PanFu
* @date 2022-04-20 11:39:11
*/
public class Sha256Encryptor implements EncryptAlgorithm {
@Override
public void init() {
}
@Override
public String encrypt(Object plaintext) {
if (null == plaintext) {
return null;
}
return DigestUtils.sha256Hex(String.valueOf(plaintext));
}
@Override
public Object decrypt(String ciphertext) {
return ciphertext;
}
@Override
public String getType() {
return "SHA256";
}
}
在resources/META-INF/services目录下新增配置,并配置文件名字为:org.apache.shardingsphere.encrypt.spi.EncryptAlgorithm
配置文件里的内容,放入自定义的加密策略的类的全路径
application.yml配置文件修改
3、创建自定义加密算法Sha256RandomEncryptor实现QueryAssistedEncryptAlgorithm(包含查询辅助列的数据加密算法)
package com.cyun.demo.sharding.sphere.encryption.config;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.shardingsphere.encrypt.spi.QueryAssistedEncryptAlgorithm;
import java.time.LocalDateTime;
/**
* 自定义数据加密策略
*
* @author He PanFu
* @date 2022-04-20 11:39:11
*/
public class Sha256RandomEncryptor implements QueryAssistedEncryptAlgorithm {
@Override
public String queryAssistedEncrypt(Object o) {
if (null == o) {
return null;
}
// 原始字符串
return DigestUtils.sha256Hex(String.valueOf(o));
}
@Override
public String encrypt(Object o) {
if (null == o) {
return null;
}
// 原始字符串+变动因子(如时间戳)
o = o + LocalDateTime.now().toString();
return DigestUtils.sha256Hex(String.valueOf(o));
}
@Override
public Object decrypt(String s) {
return s;
}
@Override
public void init() {
}
@Override
public String getType() {
return "SHA256_RANDOM";
}
}
注意:具体配置同上
参考文档:
ShardingSphere4.1.1:Sharding-JDBC数据加密及SPI加密策略实现。注意:该文档使用的版本是4.1.1,而本文使用的则是5.0.0,注意版本问题。
spring-boot集成Apache ShardingSphere 5.0.0 感知