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

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

 

3. 加密器声明
需要用到什么加密器需要事先在配置文件中声明,这样才能在字段中去引用,配置如下:

spring:
    encrypt:
      encryptors:
        # md5加密算法-sharding-jdbc内置的算法,这里名称任意
        encryptor_md5:
         # 别名,这里一定要是MD5
          type: MD5
        # aes加密算法-sharding-jdbc内置的算法,这里名称任意
        encryptor_aes:
        # 别名,这里一定要是aes
          type: aes
          props:
            # 设置秘钥
            aes.key.value: myjszl

 

上述总计配置了两种Sharding-JDBC内置的加密器,如下:

  1. encryptor_md5:MD5Encryptor加密器,这里的名称可以任意,但是type这个属性一定要是MD5
  2. encryptor_aes:AESEncryptor加密器,对称加密算法,因此需要指定加密的秘钥:aes.key.value


Sharding-JDBC指定规则如下:

#加解密器类型,可自定义或选择内置类型:MD5/AES 
spring.shardingsphere.encrypt.encryptors.<encryptor-name>.type= 

#属性配置, 注意:使用AES加密器,需要配置AES加密器的KEY属性:aes.key.value
spring.shardingsphere.encrypt.encryptors.<encryptor-name>.props.<property-name>=

 

“关于如何自定义加密器将在下文介绍。”


4. 对数据脱敏配置
下面针对三个字段进行脱敏,如下:

  • cipher_pwd:密码使用不可逆的加密器MD5Encryptor
  • id_card:身份证使用可逆的加密器AESEncryptor
  • mobile:手机号使用可逆的加密器AESEncryptor


详细的配置如下:

spring:
  # Sharding-JDBC的配置
  shardingsphere:
    encrypt:
      tables:
        t_user:
          columns:
            # 逻辑列,sharding-jdbc中写SQL需要用到的列
            password:
              # 存储明文的字段
              #plainColumn: password
              # 存储密文的字段
              cipherColumn: cipher_pwd
              # 指定加密器
              encryptor: encryptor_md5
            # 身份证号的逻辑列,使用aes这种可逆的加密算法
            id_card:
              cipherColumn: id_card
              encryptor: encryptor_aes
            # 手机号的逻辑列,使用aes这种可逆的加密算法
            mobile:
              cipherColumn: mobile
              encryptor: encryptor_aes

 

Sharding-JDBC 指定的规则如下:

spring.shardingsphere.encrypt.tables.<table-name>.columns.<logic-column-name>.encryptor= #加密器名字

spring.shardingsphere.encrypt.tables.<table-name>.columns.<logic-column-name>.plainColumn= #存储明文的字段

spring.shardingsphere.encrypt.tables.<table-name>.columns.<logic-column-name>.cipherColumn= #存储密文的字段

 

注意:上述配置中的密码这个字段,数据库表中的真实字段是cipher_pwd,但是这里笔者指定的逻辑列是password,因此在写SQL的时候,一定要写password这个逻辑列,比如查询的SQL,如下:

SELECT
 password AS cipherPwd,
 fullname,
 user_type,
 id_card AS id_card
FROM
 t_user where user_id=?

 

现在向其中插入几条数据看看效果,单元测试如下:

@Test
public void testInsertUser() {
    for (int i = 0; i < 10; i++) {
        User user = new User();
        user.setFullName("不才陈某");
        user.setCipherPwd("abc123");
        user.setIdCard("320829198708012232");
        user.setUserId((long)i);
        user.setMobile("13852331509");
        userMapper.insertUser(user);
    }
}

 

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

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