Mybtias实现字段加解密

# Mybtias实现字段加解密

支持mybatis plus

# 期望

1、实现指定注解字段,落库加密,出库解密,且内存中原始参数不变。

# 使用方式

# 1.引入坐标

     <dependency>
            <groupId>cn.lovecyy</groupId>
            <artifactId>relaxed-extend-mybatis-encrypt</artifactId>
            <version>${version}</version>
        </dependency>

# 2.application.yml

此处默认使用AES加解密,若需添加或替换默认算法 实现FieldEncryptor且注册成bean即可。

relaxed:
  mybatis:
    sec:
      aes:
       key: c6eb7f4a1df78536
      def-sec: AES

# 3.开始测试

测试单元关联信息查看==>拓展内容->单元测试信息

# 数据准备

	private  BlackData getBlackData() {
		BlackData userPo = new BlackData();
		userPo.setVcExpid("11111");
		userPo.setDDatetime(LocalDate.now());
		userPo.setCIsdelete("1");
		userPo.setVcCustname("张娜");
		userPo.setCIdentitytype("1");
		userPo.setVcIdentityno("1");
		userPo.setCCusttype("1");
		userPo.setVcModifydate(LocalDate.now());
		userPo.setVcFlag("1");
		userPo.setBirthDate("1");
		userPo.setMd5("1");
		userPo.setValid(1);
		userPo.setCreatedTime(LocalDateTime.now());
		userPo.setUpdatedTime(LocalDateTime.now());
		userPo.setCListId("123");
		return userPo;
	}
# 一、数据保存/批量保存

单数据保存

BlackData blackData = getBlackData();
		boolean testResult = blackDataService.save(blackData);
		log.info("当前数据执行结果:{},主键id{}",testResult,blackData.getId());

批数据存储

BlackData batchBlackData = getBlackData();
		BlackData batchBlackData2 = BeanUtil.toBean(batchBlackData, BlackData.class);
		batchBlackData2.setCListId("456");
	    ArrayList<BlackData> dataArrayList = ListUtil.toList(batchBlackData, batchBlackData2);
	    boolean batchTestResult = blackDataService.saveBatch(dataArrayList);
		log.info("当前数据执行结果:{},主键id:{},{}",batchTestResult,batchBlackData.getId(),batchBlackData2.getId());
# 二、数据查询

所有结果集包含注解的会自动解密成明文

实体构建参数查询,标注注解的字段自动加解密

LambdaQuery构建查询

//Wrappers.<T>lambdaQuery() 无法获取泛型 T 泛型擦除  ,此处建议使用 Wrappers.lambdaQuery(BlackData.class) 方式
		List<BlackData> list = blackDataService.list(Wrappers.lambdaQuery(BlackData.class)
				.eq(BlackData::getCListId, "123")
				.orderByDesc(BlackData::getCreatedTime));
		log.info("当前查询结果:{}",list);

mybatis查询

	BlackData queryData=new BlackData();
		queryData.setCListId("123");
		List<BlackData> list = blackDataService.getByClistId(queryData);
		log.info("当前查询结果:{}",list);

参数变量查询

//手动编码方式
//需要手动将明文参数进行编码,在传递入参。也可以在service层统一处理,
String encrypt = FieldSecurityHolder.INSTANCE.encrypt("123");
		List<BlackData> list = blackDataService.listByClistId(encrypt);

		log.info("编码后查询参数:{},当前查询结果:{}",encrypt,list);

//使用@ParamEncrypt注解标注方式
String plainText = "123";
List<BlackData> list = blackDataService.listByClistId(plainText);
		log.info("当前查询结果:{}",list);

分页查询

PageParam pageParam = new PageParam();
pageParam.setCurrent(1);
pageParam.setSize(10);
IPage<BlackData> page = blackDataService.page(PageUtil.prodPage(pageParam),s		Wrappers.lambdaQuery(BlackData.class).eq(BlackData::getCListId, "123"));
		log.info("当前分页查询结果:{}", page);
# 三、数据修改
//实体入参
BlackData blackData = blackDataService.getById(23);
		blackData.setCListId("456");
		boolean b = blackDataService.updateById(blackData);
//lambda入参
boolean update = blackDataService.update(Wrappers.lambdaUpdate(BlackData.class).eq(BlackData::getCListId, "26")
				.eq(BlackData::getCCusttype, 1).set(BlackData::getCListId, "123").set(BlackData::getCIsdelete, 1));
		log.info("执行结果:{}", update);
# 四、数据删除
boolean removeResult = blackDataService.remove(Wrappers.lambdaQuery(BlackData.class)
				.eq(BlackData::getCListId, "123"));
		log.info("数据删除结果:{}",removeResult);

# 拓展内容

# 1.内置组件

# FieldEncryptor

作用:对数据进行加解密。

内置方法:

encrypt: 对明文数据加密

decrypt: 对密文数据解密

# FieldEncrypt

作用:标识数据/字段是否需要加解密

标识类上:表示当前类需要进行加解密检测

标识字段上: 表示当前字段需要进行加解密

配套使用,若缺失任何一个加解密均不生效。

且标注字段必须为字符串类型。

# ParamEncrypt

作用:标注参数是否需要加密

仅字符串类型时生效

# 2.单元测试信息

# BlackData.java

@Data
@FieldEncrypt
@TableAlias("a")
@TableName("t_black_data")
public class BlackData implements Serializable {

	private static final long serialVersionUID = 1L;
	@TableId(value = "id", type = IdType.AUTO)
	private Integer id;
	@FieldEncrypt
	private String cListId;
	private String vcExpid;
	private LocalDate dDatetime;
	private String cIsdelete;
	private String vcCustname;
	private String cIdentitytype;
	private String vcIdentityno;
	private String cCusttype;
	private LocalDate vcModifydate;
	private String vcFlag;
	private String birthDate;
	private String md5;
	@TableLogic
	private Integer valid;
	private LocalDateTime createdTime;
	private LocalDateTime updatedTime;
}

# BlackDataMapper.java

public interface BlackDataMapper extends BaseMapper<BlackData> {

    int  insertData(BlackData data);

     List<BlackData> listByEntity(BlackData data);
     List<BlackData> listByClistId(@ParamEncrypt
                                   @Param("cListId") String cListId, @Param("ext") String ext);
     

}

# BlackDataMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.common.mapper.BlackDataMapper">


    <insert id="insertData" parameterType="org.example.common.model.entity.BlackData">

        INSERT INTO `t_black_data` ( `c_list_id`, `vc_expid`, `d_datetime`, `c_isdelete`, `vc_custname`, `c_identitytype`, `vc_identityno`, `c_custtype`, `vc_modifydate`, `vc_flag`,

                                    `birth_date`, `md5`, `valid`, `created_time`, `updated_time`)

        VALUES     ( #{cListId}, #{vcExpid}, #{dDatetime}, #{cIsdelete}, #{vcCustname}, #{cIdentitytype}, #{vcIdentityno},
                    #{cCusttype}, #{vcModifydate}, #{vcFlag}, #{birthDate}, #{md5}, #{valid}, #{createdTime}, #{updatedTime});

    </insert>
    <select id="listByEntity" resultType="org.example.common.model.entity.BlackData">
        select *  from  t_black_data where c_list_id=#{cListId}
    </select>
    <select id="listByClistId" resultType="org.example.common.model.entity.BlackData">
        select *  from  t_black_data where c_list_id=#{cListId}
    </select>
</mapper>

# IBlackDataService.java

public interface IBlackDataService extends IService<BlackData> {
    int  insertData(BlackData data);

    List<BlackData> listByEntity(BlackData data);

    List<BlackData> listByClistId(String clistId);
}

# BlackDataServiceImpl.java

@Service
public class BlackDataServiceImpl extends ServiceImpl<BlackDataMapper, BlackData> implements IBlackDataService {
    @Override
    public int insertData(BlackData data) {
        return baseMapper.insertData(data);
    }

    @Override
    public List<BlackData> listByEntity(BlackData data) {
        return baseMapper.listByEntity(data);
    }

    @Override
    public List<BlackData> listByClistId(String clistId) {
        return baseMapper.listByClistId(clistId,"11");
    }
}