方案设计:SpringBoot项目基于RSA加密的授权码

SpringBoot项目中基于RSA加密的授权码技术方案

😄生命不息,写作不止

🔥 继续踏上学习之路,学之分享笔记

👊 总有一天我也能像各位大佬一样

🏆 博客首页 @怒放吧德德 To记录领地 @一个有梦有戏的人

🌝分享学习心得,欢迎指正,大家一起学习成长!

转发请携带作者信息 @怒放吧德德(掘金) @一个有梦有戏的人(CSDN)

一、方案概述

本技术方案旨在为SpringBoot项目设计一套安全的授权码机制,通过RSA非对称加密技术实现授权码的分发、激活与验证流程。方案核心包括:

  1. SDK生成RSA密钥对并分发授权码(包含加密后的过期时间)
  2. 激活流程对接外部系统获取私钥
  3. 私钥安全存储实践
  4. SpringMVC过滤器解密验证授权有效性
  5. 过期处理与界面跳转逻辑

流程图展示了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加密、解密、签名、验签)

授权码生成流程

  1. 生成RSA密钥对(公钥+私钥)
  2. 将过期时间(如30天后的时间戳)用私钥加密
  3. 组合加密后的时间戳+随机字符串生成授权码
  4. 公钥随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 种方式)

激活流程

  1. 用户输入授权码后提交激活请求
  2. SDK调用外部系统接口验证授权码有效性
  3. 外部系统返回经Base64编码的私钥
  4. 系统将私钥存储到安全位置

三、私钥存储最佳实践

1. 安全存储方案

推荐方案

  • 使用Jasypt对私钥进行二次加密后存储在配置文件中
properties 复制代码
# application.properties
jasypt.encryptor.password=${ENCRYPTION_PASSWORD}  # 从环境变量获取
encrypted.private.key=ENC(密文私钥) 

(SpringBoot配置项加密Jasypt的正确使用)

增强安全性措施

  1. 私钥密码通过启动参数或环境变量传入
  2. 采用PBEWITHHMACSHA512ANDAES_256强加密算法
  3. 生产环境禁用默认密码提示

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. 解密与有效期验证

解密流程

  1. 从请求头获取加密授权码
  2. 加载存储的私钥
  3. 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. 授权过期策略

多级过期提醒

  1. 临近过期(7天内):返回特殊HTTP头X-License-Expire-Soon
  2. 已过期:返回403状态码
  3. 完全无授权:重定向至授权码输入页面

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";
    }
}

(SpringMVC实现页面的转发与重定向)

六、安全增强措施

  1. 防重放攻击:在授权码中添加随机nonce并记录已使用标识
  2. 密钥轮换:定期更新RSA密钥对(建议每6个月)
  3. 审计日志:记录所有授权激活和验证操作
  4. 混淆处理:对内存中的私钥进行字节混淆

七、部署注意事项

  1. 外部激活系统应部署在隔离网络区域
  2. 生产环境禁用Spring Boot Actuator的敏感端点
  3. 使用HTTPS保护所有授权相关接口
  4. 定期备份密钥存储文件

本方案通过结合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

相关推荐
tingting011911 分钟前
Spring Boot 外部配置指定不生效的原因与解决
java·spring boot·后端
2501_9096867022 分钟前
基于SpringBoot的网上点餐系统
java·spring boot·后端
天天摸鱼的java工程师28 分钟前
聊聊线程池中哪几种状态,分别表示什么?8 年 Java 开发:从业务踩坑到源码拆解(附监控实战)
java·后端
杨杨杨大侠32 分钟前
第4篇:AOP切面编程 - 无侵入式日志拦截
java·后端·开源
IT_陈寒2 小时前
Python 3.12 新特性实战:5个让你的代码效率提升50%的技巧!🔥
前端·人工智能·后端
Apifox2 小时前
Apifox 8 月更新|新增测试用例、支持自定义请求示例代码、提升导入/导出 OpenAPI/Swagger 数据的兼容性
前端·后端·测试
风飘百里2 小时前
Go语言DDD架构的务实之路
后端·架构
郭庆汝2 小时前
GraphRAG——v0.3.5版本
后端·python·flask