SpringBoot项目中基于RSA加密的授权码技术方案
😄生命不息,写作不止
🔥 继续踏上学习之路,学之分享笔记
👊 总有一天我也能像各位大佬一样
🏆 博客首页 @怒放吧德德 To记录领地 @一个有梦有戏的人
🌝分享学习心得,欢迎指正,大家一起学习成长!
转发请携带作者信息 @怒放吧德德(掘金) @一个有梦有戏的人(CSDN)
一、方案概述
本技术方案旨在为SpringBoot项目设计一套安全的授权码机制,通过RSA非对称加密技术实现授权码的分发、激活与验证流程。方案核心包括:
- SDK生成RSA密钥对并分发授权码(包含加密后的过期时间)
- 激活流程对接外部系统获取私钥
- 私钥安全存储实践
- SpringMVC过滤器解密验证授权有效性
- 过期处理与界面跳转逻辑

流程图展示了A特工、公钥、私钥与消息之间的交互逻辑,包括公钥获取、加密及私钥解密获取信息内容的完整流程
二、核心模块设计
1. SDK开发与RSA加密实现
密钥对生成:
java
// 基于Spring Boot的RSA工具类实现
public class RSAUtil {
public static Map<String, String> generateKeyPair() throws NoSuchAlgorithmException {
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
keyPairGen.initialize(2048);
KeyPair keyPair = keyPairGen.generateKeyPair();
Map<String, String> keyMap = new HashMap<>();
keyMap.put("publicKey", Base64.encodeBase64String(keyPair.getPublic().getEncoded()));
keyMap.put("privateKey", Base64.encodeBase64String(keyPair.getPrivate().getEncoded()));
return keyMap;
}
}
(Spring Boot中对API参数进行RSA加密、解密、签名、验签)
授权码生成流程:
- 生成RSA密钥对(公钥+私钥)
- 将过期时间(如30天后的时间戳)用私钥加密
- 组合加密后的时间戳+随机字符串生成授权码
- 公钥随SDK分发,私钥交由外部激活系统保管
2. 外部激活系统对接
对接方式:
- 采用Feign声明式HTTP客户端实现与外部系统的对接
- 激活接口设计示例:
java
@FeignClient(name = "activation-system", url = "${activation.server.url}")
public interface ActivationClient {
@PostMapping("/api/activate")
ResponseEntity<ActivationResponse> activateLicense(
@RequestBody ActivationRequest request,
@RequestHeader("Authorization") String token);
}
(和外部系统如何对接?Spring Boot 项目调用外部接口的 3 种方式)
激活流程:
- 用户输入授权码后提交激活请求
- SDK调用外部系统接口验证授权码有效性
- 外部系统返回经Base64编码的私钥
- 系统将私钥存储到安全位置
三、私钥存储最佳实践
1. 安全存储方案
推荐方案:
- 使用Jasypt对私钥进行二次加密后存储在配置文件中
properties
# application.properties
jasypt.encryptor.password=${ENCRYPTION_PASSWORD} # 从环境变量获取
encrypted.private.key=ENC(密文私钥)
增强安全性措施:
- 私钥密码通过启动参数或环境变量传入
- 采用PBEWITHHMACSHA512ANDAES_256强加密算法
- 生产环境禁用默认密码提示
2. Redis缓存方案
对于需要高频验证的场景,可将解密后的私钥存入Redis并设置合理过期时间:
java
// Redis存储示例
redisTemplate.opsForValue().set(
"license:privateKey:" + deviceId,
privateKey,
2, TimeUnit.HOURS);
(springboot redis mapkey 设置过期时间)
四、授权验证过滤器实现
1. SpringMVC过滤器设计
java
public class LicenseFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String license = getLicenseFromRequest(httpRequest);
if(!validateLicense(license)) {
// 授权过期跳转逻辑
RequestDispatcher dispatcher = request.getRequestDispatcher("/license/input");
dispatcher.forward(request, response);
return;
}
chain.doFilter(request, response);
}
}
(SpringMVC使用filter过滤器对数据解密并验证数据签名)
2. 解密与有效期验证
解密流程:
- 从请求头获取加密授权码
- 加载存储的私钥
- RSA解密获取原始时间戳
java
public boolean validateLicense(String encryptedLicense) {
String privateKey = loadPrivateKey(); // 从安全存储加载
String decrypted = RSAUtil.decrypt(encryptedLicense, privateKey);
long expireTime = Long.parseLong(decrypted);
return System.currentTimeMillis() < expireTime;
}
(springboot中使用RSA加密实现密码信息的密文传输)
五、过期处理与界面跳转
1. 授权过期策略
多级过期提醒:
- 临近过期(7天内):返回特殊HTTP头
X-License-Expire-Soon
- 已过期:返回403状态码
- 完全无授权:重定向至授权码输入页面
2. SpringMVC转发实现
java
@Controller
@RequestMapping("/license")
public class LicenseController {
@GetMapping("/input")
public String showInputPage() {
return "license-input";
}
@PostMapping("/activate")
public String activateLicense(@RequestParam String code) {
boolean success = activationService.activate(code);
return success ? "redirect:/home" : "license-input";
}
}
六、安全增强措施
- 防重放攻击:在授权码中添加随机nonce并记录已使用标识
- 密钥轮换:定期更新RSA密钥对(建议每6个月)
- 审计日志:记录所有授权激活和验证操作
- 混淆处理:对内存中的私钥进行字节混淆
七、部署注意事项
- 外部激活系统应部署在隔离网络区域
- 生产环境禁用Spring Boot Actuator的敏感端点
- 使用HTTPS保护所有授权相关接口
- 定期备份密钥存储文件
本方案通过结合RSA加密技术与Spring生态组件,实现了安全可靠的授权码机制,既保证了授权信息的安全性,又提供了灵活的可扩展性,适合需要严格授权管理的企业级应用场景。
参考来源
-
1\] **Spring Boot中对API参数进行RSA加密、解密、签名、验签** [原文链接](https://link.juejin.cn?target=https%3A%2F%2Fblog.csdn.net%2Flaolitou_1024%2Farticle%2Fdetails%2F130344213 "https://blog.csdn.net/laolitou_1024/article/details/130344213")
-
3\] **SpringBoot配置项加密Jasypt的正确使用** [原文链接](https://link.juejin.cn?target=https%3A%2F%2Fblog.csdn.net%2Fjianghai0906%2Farticle%2Fdetails%2F84329172 "https://blog.csdn.net/jianghai0906/article/details/84329172")
-
5\] **SpringMVC使用filter过滤器对数据解密并验证数据签名** [原文链接](https://link.juejin.cn?target=https%3A%2F%2Fblog.csdn.net%2Fzzf_start%2Farticle%2Fdetails%2F78361518 "https://blog.csdn.net/zzf_start/article/details/78361518")
-
7\] **SpringMVC实现页面的转发与重定向** [原文链接](https://link.juejin.cn?target=https%3A%2F%2Fblog.csdn.net%2Fpan_junbiao%2Farticle%2Fdetails%2F104185446 "https://blog.csdn.net/pan_junbiao/article/details/104185446")
来自 纳米 AI