聊聊 Sharding-JDBC 数据脱敏(五)

love374
发布于 2022-7-8 17:27
浏览
0收藏

 

现在使用自定义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辅助查询列的配置。

好了,上述配置好了以后就可以进行单元测试了,插入数据结果:

 聊聊 Sharding-JDBC 数据脱敏(五)-鸿蒙开发者社区
可以看到mobile这个字段的值都是不同的,但是mobile_data这个辅助查询列都是相同的,因为辅助查询列并未使用变动因子进行加密。

关于查询如果涉及到mobile的条件查询,那么将会调用queryAssistedEncrypt()方法加密后根据辅助查询mobile_data列进行查询,SQL如下图:

 聊聊 Sharding-JDBC 数据脱敏(五)-鸿蒙开发者社区
“源码已经上传GitHub,关注公众号:码猿技术专栏,回复关键词:9534  获取!”
总结
本文介绍了如何利用Sharding-JDBC 进行数据脱敏以及如何自定义加密器,文中涉及的案例代码都已经提交GitHub。

 

文章转自公众号:码猿技术专栏

标签
已于2022-7-8 17:27:16修改
收藏
回复
举报
回复
    相关推荐