聊聊 Sharding-JDBC 数据脱敏(五)
现在使用自定义SHA256加密器对密码这个列进行加密,分为如下步骤:
1.声明加密器
声明很简单,配置如下:
spring:
# Sharding-JDBC的配置
shardingsphere:
encrypt:
encryptors:
# sha256加密算法,自定义的
encryptor_sha256:
type: SHA256
2.逻辑列配置加密器
只需要将加密器的名字改成上面声明的encryptor_sha256即可,配置如下:
spring:
# Sharding-JDBC的配置
shardingsphere:
encrypt:
tables:
t_user:
columns:
# 逻辑列,sharding-jdbc中写SQL需要用到的列
password:
# 存储明文的字段
#plainColumn: password
# 存储密文的字段
cipherColumn: cipher_pwd
# 指定加密器
encryptor: encryptor_sha256
至此,配置成功了,自己去演示看一下吧,这里就不再细说了。
2. QueryAssistedEncryptor 自定义实现
下面通过Base64加密算法自定义实现一个QueryAssistedEncryptor加密器,如下:
/**
* @author 不才陈某 公众号:码猿技术专栏
* 自定义QueryAssistedEncryptor加密器
*/
@Data
public class Base64AssistedEncryptor implements QueryAssistedEncryptor {
/**
* 别名,配置时需要
*/
public final static String ALGORITHM_NAME="Base64_Assisted";
private Properties properties = new Properties();
/**
* 辅助查询列的加密方法
*/
@Override
public String queryAssistedEncrypt(String plaintext) {
if (null == plaintext) {
return null;
}
return Base64.encode(plaintext);
}
@Override
public void init() {
}
/**
* 加密方法
* 使用时间戳作为变动因子
*/
@Override
public String encrypt(final Object plaintext) {
if (null == plaintext) {
return null;
}
//获取时间戳作为变动因子
String randomFactor =String.valueOf( new Date().getTime());
return Base64.encode(plaintext+"_"+randomFactor);
}
/**
* 解密方法
* Base64是一个可逆的加密算法,因此可以对密文进行解密并且剔除变动因子则为明文
*/
@SneakyThrows
@Override
public Object decrypt(final String ciphertext) {
if (null == ciphertext) {
return null;
}
return new String(Base64.decode(ciphertext),"UTF-8").split("_")[0];
}
@Override
public String getType() {
return ALGORITHM_NAME;
}
}
需要注意以下两点:
- queryAssistedEncrypt():该方法在插入、更新逻辑列设置辅助查询列值、逻辑列作为where查询条件时会被调用对辅助查询列加密
- decrypt():这里的Base64是可逆的加密算法,因此只需要对其解密,并且剔除变动因子则为明文
同样的也需要在resource/META-INF/services目录中新建一个org.apache.shardingsphere.encrypt.strategy.spi.Encryptor文件,内容如下:
com.java.family.shardingjdbc003.encryptor.Base64AssistedEncryptor
配置也很简单,同样分为两步,如下:
1.声明加密器
配置如下:
spring:
# Sharding-JDBC的配置
shardingsphere:
encrypt:
encryptors:
# Base64加密算法,自定义的
encryptor_base64_assisted:
type: Base64_Assisted
2.逻辑列配置加密器
只需要将加密器的名字改成上面声明的encryptor_base64_assisted即可,配置如下:
![33](https://java-family.cn/BlogImage/ShardingSphere/33.png)spring:
# Sharding-JDBC的配置
shardingsphere:
encrypt:
tables:
t_user:
columns:
# 逻辑列,sharding-jdbc中写SQL需要用到的列
mobile:
# 密文存储的列
cipherColumn: mobile
# 辅助查询列,表中真实的字段名
assistedQueryColumn: mobile_data
encryptor: encryptor_base64_assisted
唯一不同的就是多了一个assistedQueryColumn辅助查询列的配置。
好了,上述配置好了以后就可以进行单元测试了,插入数据结果:
可以看到mobile这个字段的值都是不同的,但是mobile_data这个辅助查询列都是相同的,因为辅助查询列并未使用变动因子进行加密。
关于查询如果涉及到mobile的条件查询,那么将会调用queryAssistedEncrypt()方法加密后根据辅助查询mobile_data列进行查询,SQL如下图:
“源码已经上传GitHub,关注公众号:码猿技术专栏,回复关键词:9534 获取!”
总结
本文介绍了如何利用Sharding-JDBC 进行数据脱敏以及如何自定义加密器,文中涉及的案例代码都已经提交GitHub。
文章转自公众号:码猿技术专栏