涉及隐私信息的字段需要加密存储数据库,返回给前端时又需要解密显示正确信息。故采用mybatis自动加解密的方案,该方案基于自定义注解+拦截器进行实现。加密后的信息不支持模糊匹配(可参考业界流行方案,基于业务需求做分词或采用其他方案以支持模糊匹配,本文不涉及)。
网上的部分解决方案会有以下问题(已在代码中完善解决,不再细述):
1.对于对象List中的需加密属性没有加密
2.重复加密,导致密文有误
1.引入hutool-all依赖(加解密所使用依赖)
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.10</version>
</dependency>
2.定义加解密工具类
//加解密工具类
public class EncryptDecryptUtil {
private final static Logger logger = LoggerFactory.getLogger(EncryptDecryptUtil.class);
//加解密前缀
public final static String encrypt_prefix="sensitive_";
/**
* 对称加密的秘钥
*/
private final static String key = "加密密钥";
/**
* * 加密 *
* * @param declaredFields paramsObject所声明的字段
* * @param paramsObject mapper中paramsType的实例
* * @return T
* * @throws IllegalAccessException 字段不可访问异常
*/
public static <T> T encrypt(Field[] declaredFields, T paramsObject) throws IllegalAccessException {
for (Field field : declaredFields) { //取出所有被EncryptDecryptField注解的字段
EncryptDecryptField sensitiveField = field.getAnnotation(EncryptDecryptField.class);
if (!Objects.isNull(sensitiveField)) {
field.setAccessible(true);
Object object = field.get(paramsObject); //暂时只实现String类型的加密
if (object instanceof String) {
String value = (String) object; //加密 Des加密工具
if(!value.startsWith(encrypt_prefix)) {
String encryptHexStr = SecureUtil.des(key.getBytes()).encryptHex(value);
encryptHexStr=encrypt_prefix+encryptHexStr;
//logger