基于注解方式实现Http请求加密解密

https://blog.csdn.net/fishinhouse/article/details/80566138

感谢尹吉欢的开源项目。
有时候出于对请求信息安全性的考虑,会要求前后端明文传输的信息能够加密,防止被爬取和截获报文。这里提供一种前后端AES加密解密的方式,实现请求交互的安全传输,方法有一定局限.

局限1,我们假设前端传递的参数需要加密,只出现在post请求的body内。

局限2,目前只有AES加密和解密的方案。

局限3,服务端一侧的加密解密是接口级别的,需要在特定API接口添加@Encrypt注解实现Response加密,添加@Decrypt实现post请求body体的解密。

那就上代码吧。

先说集成,再说源码。

1.添加依赖,Git仓库地址monkey-api-encrypt-core

2.启动类添加@EnableEncrypt

3.添加AES 密钥配置

4.Controller类方法添加相应注解,可以在一个接口同时添加@Encrypt/@Decrypt

5.前端代码修改

js加密文件请参考GitHub中encrypt中的aes.js,crypto-js.js,pad-zeropadding.js

以axios来作为请求数据的框架,用axios的拦截器来统一处理加密解密操作

首先还是要封装一个js加解密的类,需要注意的是加密的key需要和后台的对上,不然无法相互解密,代码如下:

6.axios拦截器中统一处理代码

源码解读

启动类上的@EnableEncrypt注解是用来开启功能的,通过@Import导入自动配置类

EncryptAutoConfiguration中配置请求和响应的处理类,注册FilterRegistrationBean

FilterRegistrationBean构建参数EncryptionConfig,EncryptAlgorithm,EncryptionConfig主要用于读取AES 密钥配置信息,对于加密和解密使用注解之外,也可以通过该配置类,在配置文件内添加加密功能和解密功能的URL列表,以及忽略的URL列表

EncryptAlgorithm接口为算法接口,它有两个实现类,AES/RSA

所以核心逻辑是通过EncryptionFilter过滤器实现了加密和解密过程,那我们来看下过滤器的doFilter方法吧

核心的部分就是判断加密和解密的标识encryptionStatus和decryptionStatus将请求和响应做了包装。之后加密和解密的详细实现分别在processDecryption方法和writeEncryptContent方法。当然就是调用AES和RAS的算法实现类去处理了。

集成后通过源码分析可以看到响应加密部分的代码会把响应的整个结构加密掉,包括业务的code。而前端可能需要对code做处理,所以我们可以稍微改造下这个部分。对data部分加密,并且抛了一个encrypt字段,告诉前端,什么时候需要对response做解密操作。这部分的改造当然取决于你controller层的通用返回体是如何构造的。

完结,感谢阅读,有空Github上关注我呗~Ethan2018T1

你可能感兴趣的:(基于注解方式实现Http请求加密解密)