Springboot 项目加解密的那些事儿

红尘赠我三尺剑,酒看瘦马一世街。

1 前言

在实际的业务开发中,经常会遇到加解密的场景,一般在与外部系统交互过程中会涉及到该操作,在本文中将结合项目实际操作,展示 springboot 加解密过程中的注意事项以及核心要点。本文采用的加解密方式为 RSA + AES,而且还是用加签和验签的方式。

2 加解密方式

通常情况下,加解密方式分为对称加密(RSA)和非对称加密(AES/DES),签名的主要作用是校验报文内容是否被篡改、确保数据完整性和真实性。在本例中的将会采用非对称加密和对称加密结合使用,而且还会对报文内容进行签名。具体的流程如下所示:

r 复制代码
客户端加密过程
1 需要将明文使用json格式化,并且对内容按照字典排序,并生成格式化后的字符串,字符串的格式化是必须的,json格式技术标准统一,可以防止加解密失败。
2 使用客户端的私钥对格式化后的字符串进行签名,生成签名 sign。
3 将生成的签名放入原内容中,再次将加入签名的内容按照字典排序,生成新的字符串。
4 使用 UUID 生成随机的字符串,然后将其作为密码使用 AES 进行对称加密。
5 最后将 UUID 生成的随机密码使用 RSA 进行非对称加密。
6 最后将加密后的秘文和加密后的密码一同发送给服务端。

在客户端发送请求时,需要指定其服务的 appId, 服务端会根据不同的应用获取对应的公钥,按照如下的流程进行解密操作。其标准的请求报文如下所示:

字段名 描述
appId 应用Id
encKey RSA非对称加密后的AES加密密码
encData 使用AES密码加密后的内容
复制代码
服务端解密过程
1 服务端接收客户端的请求报文,需要使用服务端的私钥解密 encKey 的随机密码。
2 获取到随机密码后,使用 AES 解密加密后的报文。
3 获取到解密后的明文后,需要获取报文中的签名,并从解密后的内容移除。
4 将移除签名的明文,按照字段顺序进行排序获得字符串。
5 使用 appId 获取服务端存储的客户端公钥,使用客户端公钥、签名、格式后字符串进行验签。
6 验签通过后,说明解密、验签通过,请求报文没有被修改,即可将明文返回进行业务处理。

3 代码实现

在示例中,模拟了客户端请求服务端并返回结果的标准流程,具体的流程如下图所示:

客户端的加密代码如下所示,需要注意的是 json 的格式化需要按照字典排序。

服务端接收到客户端的请求后,需要根据 appId 获取客户端的公钥进行解密,验签。

针对服务的加密和客户端的解密操作和上述操作类似,这里就不再赘述。

4 总结

本文主要介绍了在 springboot中如何使用加解密和签名的实践,其中涉及到了具体的注意事项和重点。具体的代码已经上传到 github, 欢迎大家点赞和 stars。项目 github 地址 springboot-auth

相关推荐
金融数据出海12 分钟前
韩国股票 API 对接指南 Seoul&KOSDAQ
后端
geovindu13 分钟前
go: Simple Factory Pattern
开发语言·后端·设计模式·golang·简单工厂模式
咕白m62513 分钟前
Python 高效添加与管理 Excel 工作表
后端·python
计算机学姐20 分钟前
基于SpringBoot的房屋交易系统
java·vue.js·spring boot·后端·spring·intellij-idea·mybatis
java1234_小锋32 分钟前
SpringBoot 4 + Spring Security 7 + Vue3 前后端分离项目设计最佳实践
spring boot·后端·spring
今夕资源网35 分钟前
indextts API 阅读 API 重磅升级!低延迟 + 音色管理 + 缓存全拉满 支持开源阅读小说软件,其他软件应该也通用
java·后端·spring
我登哥MVP1 小时前
【Spring6笔记】 - 12 - 代理模式
java·spring boot·笔记·spring·代理模式·aop
Rick19931 小时前
Spring Cloud 原理是什么?
后端·spring·spring cloud
掘金者阿豪1 小时前
从死守 Windows 到彻底 Mac 化:程序员一旦用了 Mac,真的很难再回去
后端
阿里加多1 小时前
第 5 章:Go 内存模型与 Happens-Before 原则
开发语言·后端·golang