网站首页 > 技术文章 正文
前言
周末了,又可以愉快的敲一下自己的代码了,最近入职了一个小坑公司,不让带自己的电脑,一言难尽呀呀呀,哈哈回归正题。今天讲讲前后端分离当中,http请求报文的加解密。现在大公司都要求国密加密了,全报文加密的那种。一切为了安全嘛,还是很有必要的,单靠https证书还是不太靠谱。下面先讲加密流程。
流程
客户端-->服务端-->客户端
客户端:
1:生成随机SM4秘钥
2:使用SM2算法对SM4秘钥进行公钥加密,得到SM4秘钥密文
3:使用SM4秘钥对报文明文进行SM4加密,得到报文加密数据
4:将二个数据分别放到两个字段当中(姑且作为A,B字段)。
服务端
5:使用SM2算法先对SM4秘钥密文进行私钥解密。得到SM4秘钥原文
6:使用SM4秘钥对SM4报文密文进行解密,得到明文。
7:返回数据:使用SM4秘钥对返回报文进行SM4加密。密文放入一个字段当中(C)
客户端
8:使用SM4秘钥对返回报文进行解密,得到返回明文。
整个加密流程比较复杂,还有点影响性能。
代码
我的脚手架是基于springCloud框架,有一个统一的入口网关,那么我们就可以在网关进行报文的加密解密。我就只贴加解密的代码了。这里我用了hutool工具。
SM2加密:
SM2 sm2 = new SM2("SM2私钥", "SM2公钥");
//得到SM4秘钥密文
String sm4KeyCiphertext = sm2.encryptHex("SM4秘钥", KeyType.PublicKey);
SM2解密
SM2 sm2 = new SM2("SM2私钥", "SM2公钥");
//得到SM4秘钥明文
String sm4Key = StrUtil.utf8Str(sm2.decryptFromBcd("SM4秘钥密文", KeyType.PrivateKey));
SM4加密
SymmetricCrypto sm4 = SmUtil.sm4("SM4秘钥".getBytes());
//得到报文密文
String requestData = sm4.encryptHex("明文");
SM4解密
SymmetricCrypto sm4 = SmUtil.sm4("SM4秘钥".getBytes());
//得到报文明文
String requestData = sm4Result.decryptStr("SM4加密报文");
问题
springCloudGateway在某些异常的时候拿不到参数的值,像sentinel限流这里就没有。很奇怪,按理说是能拿到的,不纠结这个,如果遇到这种问题就获取不到SM4加密秘钥,就无法对返回参数进行加密处理。我用了一个不太成熟的方法,多返回一个参数D,这个用来标识返回的数据不是走的SM4加密,走SM2直接加密返回,前端用SM2另一套加密的私钥进行解密(这里一定不能用SM4秘钥加密的SM2公私钥)。
还有一个问题,就是上面说到的网关异常处理,大家一定要记得异常的时候也要对返回异常报文进行加密。否则你的网关在报错的时候前端就无法获取到正确的报错信息。
今天就就到这里了,想想又快要上班了,太难了。
猜你喜欢
- 2025-05-08 前端存储革命:IndexedDB 从入门到实战
- 2025-05-08 交易所安全测试(七)丨用户认证(交易所操作)
- 2025-05-08 Go进阶AES对称 Crypto-JS 加密和Go解密
- 2025-05-08 【开源】强烈推荐,国内首个开源国密前后端分离快速开发平台
- 2025-05-08 终于知道公钥、私钥、对称、非对称加密是什么了
- 2025-05-08 如何设计一套二次验证机制来防止非真实用户在12306刷票?
- 2025-05-08 前端安全-漏洞攻防指南(前端攻击以及防御方法)
- 2024-09-17 如何优雅的实现 Spring Boot 接口参数加密解密?
- 2024-09-17 浅析前端加密后数据包的修改方法
- 2024-09-17 前端上传文件或者上传文件夹
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- oracle面试 (55)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)