专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

前后端分离之http报文数据加密篇(前后端接口加密传输)

ins518 2025-05-08 01:43:46 技术文章 5 ℃ 0 评论

前言

周末了,又可以愉快的敲一下自己的代码了,最近入职了一个小坑公司,不让带自己的电脑,一言难尽呀呀呀,哈哈回归正题。今天讲讲前后端分离当中,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公私钥)。

还有一个问题,就是上面说到的网关异常处理,大家一定要记得异常的时候也要对返回异常报文进行加密。否则你的网关在报错的时候前端就无法获取到正确的报错信息。

今天就就到这里了,想想又快要上班了,太难了。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表