SpringBoot实现接口加密的五大技巧分享

 更新时间:2025年07月11日 08:58:35   作者:墨瑾轩  
为了有效应对接口安全面临的挑战,接口加密作为一种至关重要的手段,能够将原始数据转化为密文进行传输,从而确保数据在传输过程中的机密性和完整性,本文将深入探讨SpringBoot接口加密的最佳实践,需要的朋友可以参考下

5大神器,让接口“秒变”加密大师

神器1:RSA+AES混合加密——加密界的“黄金CP”

目标:用RSA加密AES密钥,用AES加密数据,实现“速度与安全兼得”。

代码示例(加密工具类)

import javax.crypto.Cipher;  
import javax.crypto.spec.IvParameterSpec;  
import javax.crypto.spec.SecretKeySpec;  
import java.security.KeyFactory;  
import java.security.spec.X509EncodedKeySpec;  
import java.util.Base64;  

// 🌟 RSA工具类(服务端生成密钥对)  
public class RSAUtil {  
    private static final String RSA_ALGORITHM = "RSA/ECB/PKCS1Padding";  

    // 🔑 生成RSA公钥和私钥(服务端执行一次)  
    public static KeyPair generateRSAKeyPair() throws Exception {  
        KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");  
        generator.initialize(2048); // 推荐2048位以上  
        return generator.generateKeyPair();  
    }  

    // 🔒 用RSA公钥加密AES密钥  
    public static byte[] encryptRSA(byte[] data, PublicKey publicKey) throws Exception {  
        Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);  
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);  
        return cipher.doFinal(data);  
    }  

    // 🔓 用RSA私钥解密AES密钥  
    public static byte[] decryptRSA(byte[] encryptedData, PrivateKey privateKey) throws Exception {  
        Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);  
        cipher.init(Cipher.DECRYPT_MODE, privateKey);  
        return cipher.doFinal(encryptedData);  
    }  
}  

// 🔐 AES工具类(对称加密)  
public class AESUtil {  
    private static final String AES_ALGORITHM = "AES/CBC/PKCS7Padding";  

    // 🔑 生成AES密钥和偏移量(客户端随机生成)  
    public static SecretKey generateAESKey() {  
        return new SecretKeySpec(KeyGenerator.getInstance("AES").generateKey().getEncoded(), "AES");  
    }  

    // 🔑 生成AES偏移量(IV)  
    public static IvParameterSpec generateIV() {  
        byte[] iv = new byte[16]; // 16字节固定长度  
        new SecureRandom().nextBytes(iv);  
        return new IvParameterSpec(iv);  
    }  

    // 🔒 AES加密数据  
    public static byte[] encryptAES(byte[] data, SecretKey key, IvParameterSpec iv) throws Exception {  
        Cipher cipher = Cipher.getInstance(AES_ALGORITHM);  
        cipher.init(Cipher.ENCRYPT_MODE, key, iv);  
        return cipher.doFinal(data);  
    }  

    // 🔓 AES解密数据  
    public static byte[] decryptAES(byte[] encryptedData, SecretKey key, IvParameterSpec iv) throws Exception {  
        Cipher cipher = Cipher.getInstance(AES_ALGORITHM);  
        cipher.init(Cipher.DECRYPT_MODE, key, iv);  
        return cipher.doFinal(encryptedData);  
    }  
}  

关键点

  • 对比纯RSA
// 纯RSA:加密慢,且无法加密超过密钥长度的数据  
// 混合加密:RSA加密小数据(AES密钥),AES加密大数据(请求参数)  

神器2:自定义注解——给接口装个“加密开关”

目标:用注解标记需要加密的接口,实现“按需加密”。

代码示例(自定义注解)

import java.lang.annotation.*;  

// 📌 自定义@RequestRSA注解  
@Target({ElementType.TYPE, ElementType.METHOD})  
@Retention(RetentionPolicy.RUNTIME)  
@Documented  
public @interface RequestRSA {  
    // 可扩展字段(如加密版本号)  
}  

神器3:AOP自动解密——让解密“隐形”

目标:通过AOP拦截请求,自动解密参数,无需手动处理。

代码示例(AOP切面)

import org.aspectj.lang.ProceedingJoinPoint;  
import org.aspectj.lang.annotation.Around;  
import org.aspectj.lang.annotation.Aspect;  
import org.springframework.stereotype.Component;  
import com.alibaba.fastjson.JSONObject;  

@Aspect  
@Component  
public class RSAAspect {  
    @Around("@annotation(RequestRSA)")  
    public Object decryptRequest(ProceedingJoinPoint joinPoint) throws Throwable {  
        // 1️⃣ 获取原始请求参数(JSON格式)  
        Object[] args = joinPoint.getArgs();  
        String rawBody = args[0].toString(); // 假设第一个参数是请求体  

        // 2️⃣ 解析sym和asy参数  
        JSONObject bodyJson = JSONObject.parseObject(rawBody);  
        String sym = bodyJson.getString("sym"); // RSA加密的AES密钥  
        String asy = bodyJson.getString("asy"); // AES加密的请求参数  

        // 3️⃣ 解密AES密钥(使用RSA私钥)  
        byte[] encryptedAESKey = Base64.getDecoder().decode(sym);  
        byte[] decryptedAESKey = RSAUtil.decryptRSA(encryptedAESKey, getPrivateKey()); // 需实现私钥获取逻辑  

        // 4️⃣ 解密请求参数(使用AES密钥)  
        byte[] aesKey = new SecretKeySpec(decryptedAESKey, "AES"); // 转换为SecretKey  
        byte[] decryptedData = AESUtil.decryptAES(  
            Base64.getDecoder().decode(asy),  
            aesKey,  
            generateIV() // 需从参数中提取IV(此处简化)  
        );  

        // 5️⃣ 将解密后的参数绑定到接口入参对象  
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();  
        Object target = joinPoint.getTarget();  
        Method method = signature.getMethod();  
        Object[] newArgs = new Object[]{JSONObject.parseObject(new String(decryptedData), method.getParameterTypes()[0])};  

        // 6️⃣ 继续执行原方法  
        return joinPoint.proceed(newArgs);  
    }  

    // 🔑 私钥获取(需替换为实际私钥)  
    private PrivateKey getPrivateKey() {  
        // 从文件或内存中加载私钥(此处简化)  
        return null;  
    }  
}  

关键点

  • 自动解密流程
// 前端 → 发送 {sym: "RSA加密的AES密钥", asy: "AES加密的参数"}  
// 后端 → 自动解密 → 参数自动绑定到接口入参对象  

神器4:异常处理——让系统“防崩防炸”

目标:优雅处理解密失败场景,避免接口崩溃。

代码示例(全局异常处理)

import org.springframework.web.bind.annotation.ExceptionHandler;  
import org.springframework.web.bind.annotation.RestControllerAdvice;  

@RestControllerAdvice  
public class GlobalExceptionHandler {  
    @ExceptionHandler(Exception.class)  
    public ResponseEntity<String> handleException(Exception e) {  
        if (e.getMessage().contains("解密失败")) {  
            return ResponseEntity.status(400).body("❌ 密钥错误或请求过期!");  
        }  
        return ResponseEntity.status(500).body("内部错误!");  
    }  
}  

神器5:全流程演示——从生成密钥到调用接口

目标:实战演示如何生成密钥、加密请求、解密响应。

代码示例(全流程)

// 🚀 服务端:生成RSA密钥对  
KeyPair rsaKeyPair = RSAUtil.generateRSAKeyPair();  
PublicKey publicKey = rsaKeyPair.getPublic(); // 分发给客户端  
PrivateKey privateKey = rsaKeyPair.getPrivate(); // 服务端保存  

// 🚀 客户端:加密请求  
// 1️⃣ 生成AES密钥和偏移量  
SecretKey aesKey = AESUtil.generateAESKey();  
IvParameterSpec iv = AESUtil.generateIV();  

// 2️⃣ 加密真实参数(如JSON字符串)  
String originalParams = "{\"username\":\"张三\", \"age\":18}";  
byte[] encryptedParams = AESUtil.encryptAES(  
    originalParams.getBytes(),  
    aesKey,  
    iv  
);  

// 3️⃣ 将AES密钥和元数据用RSA加密  
JSONObject meta = new JSONObject();  
meta.put("key", Base64.getEncoder().encodeToString(aesKey.getEncoded()));  
meta.put("keyVI", Base64.getEncoder().encodeToString(iv.getIV()));  
meta.put("time", System.currentTimeMillis());  

byte[] encryptedMeta = RSAUtil.encryptRSA(  
    meta.toJSONString().getBytes(),  
    publicKey // 客户端需提前获取公钥  
);  

// 4️⃣ 发送请求  
RequestBody requestBody = new RequestBody() {  
    "sym": Base64.getEncoder().encodeToString(encryptedMeta),  
    "asy": Base64.getEncoder().encodeToString(encryptedParams)  
};  
// → 后端自动解密并返回结果  

你的接口,现在是“防破解超接口”了吗?

通过这5大神器,我们实现了:

  1. RSA+AES混合加密:速度与安全兼得,破解者“一脸懵”。
  2. 自定义@RequestRSA注解:按需加密,代码更优雅。
  3. AOP自动解密:参数自动绑定,开发者“零感知”。
  4. 全局异常处理:解密失败也能优雅报错。
  5. 全流程演示:从密钥生成到接口调用,手把手教你落地。

到此这篇关于SpringBoot实现接口加密的五大技巧分享的文章就介绍到这了,更多相关SpringBoot接口加密技巧内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 细品Java8中hashCode方法的使用

    细品Java8中hashCode方法的使用

    这篇文章主要介绍了细品Java8中hashCode方法的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Spring创建BeanDefinition之路径扫描详解

    Spring创建BeanDefinition之路径扫描详解

    这篇文章主要介绍了Spring创建BeanDefinition之路径扫描方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • Java测试框架Mockito的简明教程

    Java测试框架Mockito的简明教程

    这篇文章主要介绍了Java测试框架Mockito的简明教程,Mock 测试是单元测试的重要方法之一。本文介绍了基于 Java 语言的 Mock 测试框架 – Mockito 的使用。,需要的朋友可以参考下
    2019-06-06
  • Java基于JNDI 实现读写分离的示例代码

    Java基于JNDI 实现读写分离的示例代码

    本文主要介绍了Java基于JNDI 实现读写分离的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Java HashMap实现原理分析(一)

    Java HashMap实现原理分析(一)

    这篇文章主要介绍了Java HashMap实现原理的分析,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-08-08
  • FeignClient如何脱离eureka自定义URL

    FeignClient如何脱离eureka自定义URL

    这篇文章主要介绍了FeignClient如何脱离eureka自定义URL,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Java设计模式常用的七大原则总结

    Java设计模式常用的七大原则总结

    今天给大家总结了Java设计模式的七大原则,主要有单一职责原则,接口隔离原则,依赖倒转原则,里氏替换原则等,文中有非常详细的介绍,需要的朋友可以参考下
    2021-06-06
  • Jmeter命令行执行脚本如何设置动态参数

    Jmeter命令行执行脚本如何设置动态参数

    这篇文章主要介绍了Jmeter命令行执行脚本如何设置动态参数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • redis分布式锁的原理及代码实例

    redis分布式锁的原理及代码实例

    这篇文章主要介绍了redis分布式锁的原理及代码实例,Redis作为一款高性能内存数据库,其提供了一种非常实用的分布式锁解决方案,可以帮助开发人员轻松地实现分布式锁功能,对于分布式系统的开发和维护,具有非常大的实用价值,需要的朋友可以参考下
    2024-01-01
  • Java的Function接口与andThen组合及解读

    Java的Function接口与andThen组合及解读

    文章介绍了Java 8中的Function接口及其andThen方法,详细解释了Function接口的基础概念、用法、组合机制及应用,包括与compose方法的对比、在Stream API中的使用场景、高级应用场景和最佳实践,并强调了保持代码简洁、可读性和灵活性的重要性
    2026-04-04

最新评论