导航
导航

记一次三级等保漏洞修复问题处理

负责的项目在一期收尾阶段,后面需要配合通过三级等保,所以重心在跟进三级等保验证。检测厂商提供第一轮的漏洞报告,看了一下需要修改的地方,对于应用而言有一项是手机号数据需要落库加密和页面脱敏处理。为了不影响客户竣工就开始了处理。

后端数据加密解密方案使用的AES,然后统计了一下应用牵连到手机号地方业务蛮多,盲目的代码一个一个加费时费力遂想到的方案就是aop处理。开始定在Service层的入参出参,之后分析加密解密跨度大 内部调用会有漏掉导致未解密。所以定的方案就是aop处理mapper层代码。

然后出现个问题,spring aop不能拦截mybatis层接口,排查后发现不能生效的原因是mybatis本身会使用jdk动态代理来为我们生成一个Mapper接口的实现类,而aop是在对这个Mapper使用cglib代理。我们项目当前框架使用的是springboot1.x,看网友分析2.x的可以,对于现在而言轻易改底层不合理,方案pass。

对于dao层处理,aop目前不行,我就想到了mybatis拦截器。

在mybatis中可被拦截的类型有四种(按照拦截顺序):

  1. Executor:拦截执行器的方法。
  2. ParameterHandler:拦截参数的处理。
  3. ResultSetHandler:拦截结果集的处理。
  4. StatementHandler:拦截Sql语法构建的处理。

对于入参加密 选择ParameterHandler,对参数进行拦截修改处理

@Component
@Intercepts({
@Signature(type = ParameterHandler.class, method = "setParameters", args = PreparedStatement.class)
})
public class EncryptInterceptor implements Interceptor {
//处理.....
}

对于出参解密使用ResultSetHandler的handleResultSets方法作为sql执行之后的结果拦截过滤

@Component
@Intercepts({
@Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})
})
public class DecryptInterceptor implements Interceptor {
//处理....
}

为了快速排除干扰项,定义了2个自定义注解 一个类上标识@EncryptEntity 一个需要加密解密的字段上标识@EncryptField

以上处理后实现了对敏感数据落库加密解密