[049][Crypto模块]前后端混合加密API实战:基于Spring Boot的AES+RSA安全传输方案 [049][Crypto模块]前后端混合加密API实战基于Spring Boot的AESRSA安全传输方案本文章代码: gitee , gitcode , github摘要在Web应用开发中保障API请求的机密性至关重要。单纯的HTTPS虽然能保护传输链路但在某些场景下如内网穿透、网关卸载SSL、客户端加密需求仍需对请求体进行端到端加密。本文通过一个完整的Spring Boot后端加密框架和Thymeleaf前端页面示例详细讲解如何实现非对称加密RSA分发对称密钥 对称加密AES/ECB/PKCS5Padding加密请求体的混合加密方案并针对前端加密细节Hex格式输出、ECB模式适配进行了定制化改造。文章将分析核心代码、梳理加密流程并提供可直接运行的实践方案。一、背景与目标许多业务系统需要传输用户敏感信息如身份证、手机号、财务数据。常规做法是依赖HTTPS但有些合规要求或特殊架构需要应用层加密。混合加密的优势在于非对称加密RSA安全传输临时密钥解决密钥分发问题。对称加密AES效率高适合加密大量请求体数据。本文实现的系统要求后端提供公钥获取接口/api/crypto/publicKey返回RSA公钥Hex格式、非对称算法类型、对称算法类型。前端在提交请求时随机生成AES对称密钥Hex字符串。使用RSA公钥加密该对称密钥将密文Hex或Base64放入请求头X-Crypto-Secret-Key。使用AES/ECB/PKCS5Padding算法加密整个JSON请求体将密文Base64作为请求体发送。后端通过Crypto(requesttrue)注解自动拦截并解密请求体还原为原始Java对象供业务使用。二、后端核心实现分析后端基于Spring Boot利用RequestBodyAdvice实现全局解密使用Caffeine缓存对称加密处理器避免每次请求都重新解析RSA私钥和初始化AES引擎。2.1 注解驱动CryptoTarget(ElementType.METHOD)Retention(RetentionPolicy.RUNTIME)publicinterfaceCrypto{booleanresponse()defaultfalse;booleanrequest()defaulttrue;}在控制器方法上标记Crypto(request true)表示该请求体需要自动解密。2.2CryptoRequestBodyAdvice– 请求体解密核心该类实现RequestBodyAdvice重写beforeBodyRead方法从HTTP Headers中获取加密的对称密钥X-Crypto-Secret-Key。利用非对称处理器RSA私钥解密得到明文的对称密钥字符串。通过缓存模板CryptoRequestCacheTemplate获取或创建对应的对称加密处理器AES。用对称处理器解密请求体原文包装成新的HttpInputMessage供Spring MVC继续读取。关键代码StringencryptedSecretKeyHeaderUtils.getHeader(...,DefaultConsts.HTTP_HEADER_CRYPTO_SECRET_KEY);CryptoProcessorcryptoProcessorcryptoRequestCacheTemplate.createIfAbsent(encryptedSecretKey);StringdecryptedBodycryptoProcessor.decrypt(encryptedBody);returnnewDecryptHttpInputMessage(inputMessage,decryptedBody.getBytes());2.3 缓存模板CryptoRequestCacheTemplate继承AbstractCaffeineCacheTemplatevalueGenerator方法执行真正的密钥解析与处理器创建publicCryptoProcessorvalueGenerator(Stringkey){StringsecretKeyasymmetricProcessor.decrypt(key);// RSA解密获得对称密钥明文returnsymmetricProcessor.newInstance(newSecretKey(secretKey));}每次新请求携带的加密对称密钥都会触发一次非对称解密然后生成AES处理器并缓存避免重复解析。2.4 公钥端点CryptoEndpoint前端首先调用该接口获取加密策略GetMapping(publicKey)publicCryptoInfogetPublicKey(){StringpublicKeyHexcryptoProcessor.getSecretKey().publicKeyHex();returnnewCryptoInfo(asymmetricCryptoStrategy,symmetricCryptoStrategy,publicKeyHex);}返回的CryptoInfo包含算法类型和公钥Hex前端据此配置加密参数。三、完整前端提交流程最终的前端提交逻辑调用/api/crypto/publicKey获取RSA公钥Hex和算法类型。生成16字节随机AES密钥Hex。使用RSA公钥加密该密钥得到Hex密文放入请求头X-Crypto-Secret-Key。构造业务JSON对象使用AES/ECB/PKCS5Padding加密得到Base64密文作为请求体。发送POST请求到/api/secure/submit后端自动解密并返回业务结果。四、关键技术点总结4.1 编码一致性至关重要后端RSA解密时需要知道前端传来的加密对称密钥是Hex还是Base64。本文最终统一为Hex格式。对称密钥明文也约定为Hex字符串32字符对应16字节后端需要按Hex解析字节数组。4.2 ECB模式注意事项ECB模式不使用IV同一密钥加密相同明文块会得到相同密文块存在一定安全性风险。但若后端要求强制使用ECB则需严格对齐填充方式PKCS5Padding/PKCS7Padding。CryptoJS的pad.Pkcs7与Java的PKCS5Padding实际兼容AES块大小128位PKCS5定义为8字节块但实践中常混用。4.3 缓存策略后端缓存了CryptoProcessor实例避免每次请求都执行非对称解密。但必须确保加密对称密钥相同才会命中缓存——由于前端每次随机生成新密钥缓存实际上很少命中。更好的设计是根据用户会话缓存但本例仅为演示。4.4 公钥获取与更新前端应在页面加载时获取公钥并保留直到页面刷新。若后端轮换密钥对前端应重新获取否则无法解密。五、运行与测试启动Spring Boot应用确保包含CryptoRequestBodyAdvice、CryptoEndpoint、SecureApiController等组件。访问Thymeleaf页面例如/secure-test页面自动加载公钥并生成随机对称密钥。填写表单点击提交观察浏览器开发者工具中的请求体为密文请求头包含加密的对称密钥。后端控制台输出解密后的业务数据并返回JSON响应。六、总结与扩展本文从完整的后端加密框架出发详细分析了基于注解的请求自动解密实现并针对前端的加密细节进行了三次定制化改造Hex密钥、RSA Hex输出、AES ECB模式。这套混合加密方案具备较高的实用价值可直接应用于需要应用层加密的内部系统或API网关场景。扩展建议可将对称密钥与用户会话绑定避免每次请求重新生成提高性能。增加时间戳或随机数防重放攻击。对响应体也进行对称加密Crypto(responsetrue)形成双向加密通道。通过本文的讲解和代码示例开发者可以快速搭建一套前后端一体的加密通信系统并根据实际需求灵活调整加密算法和编码格式。