关注

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

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

😄生命不息,写作不止
🔥 继续踏上学习之路,学之分享笔记
👊 总有一天我也能像各位大佬一样
🏆 博客首页   @怒放吧德德  To记录领地
🌝分享学习心得,欢迎指正,大家一起学习成长!

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


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

一、方案概述

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

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

流程图展示了A特工、公钥、私钥与消息之间的交互逻辑,包括公钥获取、加密及私钥解密获取信息内容的完整流程

二、核心模块设计

1. SDK开发与RSA加密实现

密钥对生成

// 基于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客户端实现与外部系统的对接
  • 激活接口设计示例:
@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对私钥进行二次加密后存储在配置文件中
# application.properties
jasypt.encryptor.password=${ENCRYPTION_PASSWORD}  # 从环境变量获取
encrypted.private.key=ENC(密文私钥) 

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

增强安全性措施

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

2. Redis缓存方案

对于需要高频验证的场景,可将解密后的私钥存入Redis并设置合理过期时间:

// Redis存储示例
redisTemplate.opsForValue().set(
    "license:privateKey:" + deviceId, 
    privateKey, 
    2, TimeUnit.HOURS);

(springboot redis mapkey 设置过期时间)

四、授权验证过滤器实现

1. SpringMVC过滤器设计

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解密获取原始时间戳
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转发实现

@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加密、解密、签名、验签 原文链接
  • [2] 和外部系统如何对接?Spring Boot 项目调用外部接口的 3 种方式 原文链接
  • [3] SpringBoot配置项加密Jasypt的正确使用 原文链接
  • [4] springboot redis mapkey 设置过期时间 原文链接
  • [5] SpringMVC使用filter过滤器对数据解密并验证数据签名 原文链接
  • [6] springboot中使用RSA加密实现密码信息的密文传输 原文链接
  • [7] SpringMVC实现页面的转发与重定向 原文链接

以上内容均由AI搜集总结并生成,仅供参考

来自 纳米 AI

转载自CSDN-专业IT技术社区

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_43843951/article/details/150920042

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--