前言
好吧,是标题党,最近公司需要对一些敏感字段落库出库时候加解密,类似的功能市面上很多,也不难实现,而且mybatis-plus 高级企业特性也提供这样的插件
但是这个插件是"收费"的,此处打引号表示不是收钱,而是需要加群写推文等一系列操作才能拿到吧,懒得去看,而且从demo上面看到的jar包,也是加密过的,全是洞洞
顶着恶心的感觉研究一下了,基本可以实现出库解密,落库加密,但是有一样少了,就是查询时,当where条件有加密字段时,没有自动其加密处理,固,花了点时间研究一下mybatis的拦截器,重复造个轮子
介绍
mybatis-plus-encrypt 是一款针对mybatis 的数据加密工具,原理基于mybatis的拦截器实现,包含以下功能
- 保存/更新操作时,落库时对某字段进行加密
- 查询操作时,对返回字段进行解密
- 查询操作时,对加密字段的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);
一点都不优雅,本工具支持自动对条件进行加密,支持以下的查询方式:
- 支持mybatis-plus的单表查询:xxService.lambdaQuery() 、xxService.query()
- 支持原生mybatis mapper 查询,入参为单一对象的方法: User query(xxDTO dto)
- 原生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…