当前位置: 首页 > 后端技术 > Java

一个注解搞定SpringBoot接口定制属性加解密

时间:2023-04-01 20:20:04 Java

一个注解处理SpringBoot接口自定义属性的加解密然后就交给我这个“垃圾收集器”了。本周甲方另一厂商监控平台扫描到我方项目部分接口敏感信息未加密,要求我方立即处理。查了一下,发现还真是这样。手机和身份证号没有脱敏,心里万兽奔腾。幸运的是,我有长期处理此类突发事件的经验。我直接写了一个自定义的注解,然后在需要加解密的接口上加上。与前端连接调试,Oak搞定。之后,我的脸仍然很沉重。但内心平静钓鱼,那么奔放。趁着钓鱼的空闲时间,我把实现方法简化了,用最通俗易懂的方式分享出来。可以存起来,哪天需要的时候可以捞出来,省点思考时间。技术版本
实现过程1.引入依赖2.实体类我们定义了两个实体类,一个是模拟查询用户信息时接口响应返回的对象UserInfo。一种是保存用户时的请求对象UserInfoReq。这样我们就可以测试查询接口返回对象敏感属性的加密和保存接口请求对象敏感属性的解密。3.yml配置这里主要添加key的自定义配置,方便灵活修改。4.自定义注解这里,我们为注解定义了两个参数,请求时要解密哪些属性,响应时要加密哪些属性,分别给出默认值。5、加解密工具类加解密工具类,我们使用Hutool提供的AES加解密工具。这里需要注意两点:1)获取工具类中的yml配置,加上@component注解,然后给变量setstatic,但是set方法去掉static,把@Value放在set方法上,否则不生效;2)AES工具的构建要放在@PostConstruct注解中,表示Spring容器初始化bean后加载的内容,没有这个直接构建的话会抛空指针异常。6.AOP切面这里是自定义注解的AOP切面类,也是具体的实现。核心思想是利用Java的反射机制。有些写法一般是固定的,可以适当理解。不建议了解太多,以免造成麻烦。7.测试接口首先我们测试一下查询接口,并对返回对象的一些敏感属性进行加密。这里,我们设置reqPropsName={},表示请求参数不加解密,设置respPropsName={"phone","idCard","name"},表示手机号,身份证号,和返回对象中的名称加密返回。接下来我们测试一下save接口来解密request对象的一些加密属性。这里,我们设置reqPropsName={"phone","idCard","name"},表示对请求参数中的手机号、身份证号、姓名进行解密,设置respPropsName={},表示不解密解密返回的对象密码操作。执行完save接口后,我们直接返回这个对象,看是否已经解密。8、效果查询接口返回对象加密效果并保存接口请求对象解密效果汇总。有很多功能可以通过自定义注解来实现。稳定的。这里的加解密注解还是有局限性的:1)、只支持有明确的公共返回对象的接口,比如这里的Result;2)、只支持@RequestBody请求对象,其他形式如multipleparam参数、Map等支持,可以自行扩展;虽然不完美,但总的来说已经够用了,因为大多数SpringBoot项目都遵循规范,都会定义公共返回对象,而且大部分请求接口也是通过@RequesetBody来接收的。在AOP方面的实现中,请求对象的类型也有一个漏洞。感兴趣的朋友可以下载源码自行扩展。是练习的好选择。源码会在评论区给出~原创文章纯手写,如果觉得有一点点帮助,请点赞加收藏~继续分享真实的心得和工作中的心得,喜欢的话,请关注哦~更多更多最新技术文章,请关注GZH:【Java分享客栈】