本文并非详细探讨AES加解密内容,而是在Spring+Mybatis的项目基础上,以sql拦截器的形式,实现了对数据存取加解密的方案。文章项目示例采用springboot框架,对需要加解密的字段添加注解,sql执行过程中,拦截器进行拦截。可通过配置加解密开关决定是否对字段进行加解密。加密方式AES。
文章并未列出所有源码,依赖包等详细配置,在源码中有具体的sql脚本等文件,点击访问项目源码。
- 源码框架
java8 springboot mybatis gradle
加解密工具
方法generateAESKey()生成128位秘钥,以16进制字符串保存,从配置文件读取,以单例模式初始化加解密工具,保证项目运行过程中对象不会被重新创建,避免多次初始化Cipher。加解密方法详见代码如下。
1 | /** |
加解密字段注解
注解标识字段是否需要加密或者解密,用于通过反射获取需要进行加解密的字段,防止需求变动,将加密和解密注解分开。
加密注解
1 | /** |
解密注解
1 | /** |
封装加解密工具
为了在项目中方便使用,将上节中的加解密工具进行封装,封装后的工具可以作用于对象,通过反射获取注解,而对原对象进行改变。另外,项目中也实现了对象的自加解密CrypticPojo,原理是CrypticPojo实现clone方法,并在内部实现加解密方法,需要进行字段加解密的业务对象只需要继承CrypticPojo,每次返回调用一次克隆并加密方法即可,具体见源码。
1 | /** |
拦截器
使用sql拦截器处理加解密基本是对项目影响比较小的。该拦截器通过拦截sql,对写入数据和查询结果进行重写,然后再放行从而更改对象。 关于sql语句参数,文章中并没有在拦截器处理,而是使用一个LinkedMap封装了查询参数,在封装的过程中会对字段进行加密。 关于springboot中和spring中拦截器使用的区别下文将会介绍。
1 | /** |
不同框架配置说明
springboot下的配置
- 启动主类需要添加mapper扫描注解
1 |
|
- 配置文件application.properties需要添加映射
1 | # Mybatis |
- 拦截器会自动扫描,注意@Component注解
spring的xml配置
- mybatis当然和传统配置一致,在spring上下文配置中添加
- 拦截器配置,在spring上下文配置文件sqlsessionfactory中
1 | <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> |
说明
注意:文章中的代码只是部分,源码包含完整的测试和说明,点击访问项目源码。