- 背景
- 思路
- 实现
- 思考
背景
最近接到需求需要对数据库中的电话、身份证号等敏感信息进行脱敏加密处理,再加上之前面试时也被问到相关问题,所有在此记录。脱敏对象是数据库的字段,所以在数据库存取的出入口进行加解密操作是最合适的,项目中使用mybatis作为ORM框架,所以使用基于mybatis的数据库脱敏。
思路
对数据库中的数据进行脱敏处理,核心思想就是在入库时对敏感字段进行加密,在出库时对敏感字段解密。看清了这个问题,我们的关注点就有两个。
- 何时?入库和出库
- 何地?入参和查询结果
mybatis框架中的plugin,能够对上面两个关注点进行很好的控制,再结合自定义注解,对需要脱敏的字段进行标注,就能够满足我们的需求。
实现
理论知识储备
- mybatis interceptor执行流程与原理(blog.csdn.net/weixin_3949…)
- 自定义注解
- 反射
- 定义自定义注解,用于标识敏感字段
1 | less复制代码/** |
- mybatis插件逻辑(对项目中使用的pagehelper和mybatis-processor插件兼容)
1 | ini复制代码 |
- 插件的使用
在项目启动时注册插件(注意,根据mybatis插件的执行原理,此插件需要在最后注册,才能保证最先解析参数)
1 | java复制代码SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); |
对需要加密处理的字段标注@Encrypt注解(入参和结果DTO对象字段都需要标注)
1 | typescript复制代码 @Encrypt |
思考
通过mybatis的插件对数据库的增删改查实现脱敏处理还是比较简单的。重点就在于:
- 拦截Executor对象的query和update方法,获取查询/更新参数和查询结果集
- 通过反射对参数中标注自定义注解的字段进行加/解密处理
在开发过程中也遇到了由于使用了pagehelper插件,导致自定义拦截器不生效的问题,最后查阅pagehelper的文档解决了(需要根据pagehelper定义的拦截器编写规范来开发)。
完整的代码参考:
参考文档:
本文转载自: 掘金