Springboot项目报文加密(AES、RSA、Filter动态加密)
Springboot项目报文加密(AES、RSA、Filter动态加密)
- 一、痛点
-
- 1.1、初版报文加密
- 二、前期准备
-
- 2.1、AES加密
- 2.2、RSA加密
- 2.3、国密算法概述
- 2.4、国密SM2
- 2.5、国密SM3
- 2.6、国密SM4
- 2.7、JAVA中的拦截器、过滤器
- 2.8、请求过滤器
- 2.9、响应过滤器
- 2.10、登录验证码
- 2.11、BCrypt非对称加密
- 三、逻辑整理
-
- 3.1、建立前后端连接
- 3.2、登录接口特殊处理
- 3.3、接口加解密模式
- 3.4、模式逻辑说明
- 四、关键代码
-
- 4.1、会话通知
- 4.2、登录
- 4.3、接口处理
- 五、接口样例
-
- 5.1、会话通知
- 5.2、登录
- 5.3、普通接口
- 5.4、导入接口
- 5.5、导出接口
- 六、其他
最近一直在处理加密相关问题,对秘钥进行复杂化处理、进程非固定化逻辑处理,等等一些简单处理方式,还是解决不了cookie存储秘钥等问题。
于是在原有方式上进行了改进,优化了加密的模式来改进这一问题。
目的是减少前端存储固定秘钥不安全等带来的一系列问题。
一、痛点
在项目加密环节,如仅采用秘钥加密,一但秘钥泄露,那每一次的会话及请求的报文,则无异于暴露在外,存在安全隐患。
1.1、初版报文加密
阅读本篇博客前建议先阅读初版内容:
Springboot项目报文加密(采用AES、RSA动态加密策略):https://blog.csdn.net/qq_38254635/article/details/129275971
二、前期准备
在处理该问题前,需先了解一些加密,如AES、RSA,国密SM2、SM3、SM4,Filter等。
2.1、AES加密
AES加密:https://blog.csdn.net/qq_38254635/article/details/129622075
2.2、RSA加密
RSA加密:https://blog.csdn.net/qq_38254635/article/details/129623413
2.3、国密算法概述
国密:https://blog.csdn.net/qq_38254635/article/details/131801527
2.4、国密SM2
国密SM2:https://blog.csdn.net/qq_38254635/article/details/131810661
2.5、国密SM3
国密SM3:https://blog.csdn.net/qq_38254635/article/details/131810696
2.6、国密SM4
国密SM4:https://blog.csdn.net/qq_38254635/article/details/131810715
2.7、JAVA中的拦截器、过滤器
JAVA中的拦截器、过滤器:https://blog.csdn.net/qq_38254635/article/details/131201519
2.8、请求过滤器
请求过滤器:https://blog.csdn.net/qq_38254635/article/details/136041159
2.9、响应过滤器
响应过滤器:https://blog.csdn.net/qq_38254635/article/details/136041183
以及登录相关内容:
2.10、登录验证码
登录验证码:https://blog.csdn.net/qq_38254635/article/details/129735679
2.11、BCrypt非对称加密
BCrypt非对称加密:https://blog.csdn.net/qq_38254635/article/details/129746320
三、逻辑整理
3.1、建立前后端连接
前端发送通知,告诉后端需要建立连接请求。
3.2、登录接口特殊处理
区别登录接口与其他接口。
3.3、接口加解密模式
接口加解密模式。
3.4、模式逻辑说明
此模式, Web端 仅需存储 RSA公钥 , Server端 仅需存储 RSA私钥 。
每次开始:
Web端 随机生成 AES秘钥 ,并将 报文 采用 AES秘钥 加密得到 webCipherText ,且将 AES秘钥 采用 RSA公钥 加密得到 cipherKey ,将两个参数传给 Server端 。
Server端 采用 RSA私钥 解密 cipherKey 得到 AES秘钥 ,再用 AES秘钥 解密 webCipherText 得到 报文 。
Server端 进行业务逻辑处理。
Server端 将返回的 报文 采用 AES秘钥 加密得到 ServerCipherText ,返回给 Web端
Web端 采用 AES秘钥 解密 ServerCipherText 得到 报文 。
请求结束。
四、关键代码
4.1、会话通知
会话通知:生成秘钥对,后端Redis及session存储
public Map<String, String> notice() throws Exception{
String uk = UniqueUtil.getUniqueKey();
Map<String, String> keyPair = RSAUtils.generateKeyPair();
RedisUtil redisUtil = SpringContextUtils.getBean(RedisUtil.class);
redisUtil.hPutObject(EncryptEnum.Redis.RSA_PATH + uk, EncryptEnum.Redis.RSA_KEY, keyPair