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

相关推荐
xmjd msup20 分钟前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
Vane123 分钟前
从零开发一个AI插件,经历了什么?
人工智能·后端
952361 小时前
SpringBoot统一功能处理
java·spring boot·后端
rleS IONS1 小时前
SpringBoot中自定义Starter
java·spring boot·后端
DevilSeagull1 小时前
MySQL(2) 客户端工具和建库
开发语言·数据库·后端·mysql·服务
TeDi TIVE2 小时前
springboot和springframework版本依赖关系
java·spring boot·后端
雨辰AI2 小时前
SpringBoot3 + 人大金仓 V9 微服务监控实战|Prometheus+Grafana+SkyWalking 全链路监控
数据库·后端·微服务·grafana·prometheus·skywalking
二哈赛车手2 小时前
新人笔记---ES和kibana启动问题以及一些常用的linux的错误排查方法,以及ES,数据库泄密解决方案[超详细]
java·linux·数据库·spring boot·笔记·elasticsearch
Nicander3 小时前
理解 mybatis 源码:vibe-coding一个mini-mybatis
后端·mybatis
小呆呆6664 小时前
Codex 穷鬼大救星
前端·人工智能·后端