Mybatis-Plus的加密插件居然是"收费"的!?自己手撸一个加密插件

991 阅读2分钟

前言

好吧,是标题党,最近公司需要对一些敏感字段落库出库时候加解密,类似的功能市面上很多,也不难实现,而且mybatis-plus 高级企业特性也提供这样的插件

但是这个插件是"收费"的,此处打引号表示不是收钱,而是需要加群写推文等一系列操作才能拿到吧,懒得去看,而且从demo上面看到的jar包,也是加密过的,全是洞洞

image.png

顶着恶心的感觉研究一下了,基本可以实现出库解密,落库加密,但是有一样少了,就是查询时,当where条件有加密字段时,没有自动其加密处理,固,花了点时间研究一下mybatis的拦截器,重复造个轮子

介绍

mybatis-plus-encrypt 是一款针对mybatis 的数据加密工具,原理基于mybatis的拦截器实现,包含以下功能

  1. 保存/更新操作时,落库时对某字段进行加密
  2. 查询操作时,对返回字段进行解密
  3. 查询操作时,对加密字段的where条件参数进行加密处理

PS:为什么叫mybatis-plus-encrypt?一来是蹭热点,二来是多mybatis-plus做了特殊处理,其单表查询也支持加解密

使用

实体类与查询参数对象,需要继承Encrypted,在需要加解密的字段加上注解@Encrypt

@Data
@Accessors(chain = true)
@TableName(value = "user")
public class UserEntity implements Encrypted {

    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    @Encrypt
    private String mobile;
}

关于查询操作时,对加密字段的条件参数进行加密处理的说明

在日常查询时中,如根据手机号查出某用户,在查询前,别的工具往往需要先硬编码加密

String mobile="131xxxxxx";
mobile= 加密(mobile);

User user=new User();
user.setMobile(mobile);

xxService.getOne(user);

一点都不优雅,本工具支持自动对条件进行加密,支持以下的查询方式:

  1. 支持mybatis-plus的单表查询:xxService.lambdaQuery() 、xxService.query()
  2. 支持原生mybatis mapper 查询,入参为单一对象的方法: User query(xxDTO dto)
  3. 原生mybatis mapper 查询,入参为字符串
@Mapper
public interface UserMapper extends BaseMapper<UserEntity> {

    /**
     * 入参为字符串
     */
    @Select("select * from user where mobile=#{mobile}")
    UserEntity getByPhone1(@Encrypt @Param("mobile") String mobile);

    /**
     * 入参为对象
     */
    UserEntity getByPhone2(UserQueryDTO dto);

}

插件开源,随便拿去用吧:gitee.com/heys1/mybat…