如何简单的实现 Spring Boot 接口参数加密解密?

加密解密本身并不是难事,问题是在何时去处理?定义一个过滤器,将请求和响应分别拦截下来进行处理也是一个办法,这种方式虽然粗暴,但是灵活,因为可以拿到一手的请求参数和响应数据。不过 SpringMVC 中给我们提供了 ResponseBodyAdvice 和 RequestBodyAdvice,利用这两个工具可以对请求和响应进行预处理,非常方便。

所以今天这篇文章有两个目的:

  • 分享参数/响应加解密的思路。
  • 分享 ResponseBodyAdvice 和 RequestBodyAdvice 的用法。

好了,那么接下来就不废话了,我们一起来看下。

1.开发加解密 starter

为了让我们开发的这个工具更加通用,也为了复习一下自定义 Spring Boot Starter,这里我们就将这个工具做成一个 stater,以后在 Spring Boot 项目中直接引用就可以。

首先我们创建一个 Spring Boot 项目,引入 spring-boot-starter-web 依赖:


  1. <dependency> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-starter-web</artifactId> 
  4.     <scope>provided</scope> 
  5.     <version>2.4.3</version> 
  6. </dependency> 

因为我们这个工具是为 Web 项目开发的,以后必然使用在 Web 环境中,所以这里添加依赖时 scope 设置为 provided。

依赖添加完成后,我们先来定义一个加密工具类备用,加密这块有多种方案可以选择,对称加密、非对称加密,其中对称加密又可以使用 AES、DES、3DES 等不同算法,这里我们使用 Java 自带的 Cipher 来实现对称加密,使用 AES 算法:


  1. public class AESUtils { 
  2.  
  3.     private static final String AES_ALGORITHM = "AES/ECB/PKCS5Padding"
  4.  
  5.     // 获取 cipher 
  6.     private static Cipher getCipher(byte[] keyint model) throws Exception { 
  7.         SecretKeySpec secretKeySpec = new SecretKeySpec(key"AES"); 
  8.         Cipher cipher = Cipher.getInstance(AES_ALGORITHM); 
  9.         cipher.init(model, secretKeySpec); 
  10.         return cipher; 
  11.     } 
  12.  
  13.     // AES加密 
  14.     public static String encrypt(byte[] data, byte[] key) throws Exception { 
  15.         Cipher cipher = getCipher(key, Cipher.ENCRYPT_MODE); 
  16.         return Base64.getEncoder().encodeToString(cipher.doFinal(data)); 
  17.     } 
  18.  
  19.     // AES解密 
  20.     public static byte[] decrypt(byte[] data, byte[] key) throws Exception { 
  21.         Cipher cipher = getCipher(key, Cipher.DECRYPT_MODE); 
  22.         return cipher.doFinal(Base64.getDecoder().decode(data)); 
  23.     } 

这个工具类比较简单,不需要多解释。需要说明的是,加密后的数据可能不具备可读性,因此我们一般需要对加密后的数据再使用 Base64 算法进行编码,获取可读字符串。换言之,上面的 AES 加密方法的返回值是一个 Base64 编码之后的字符串,AES 解密方法的参数也是一个 Base64 编码之后的字符串,先对该字符串进行解码,然后再解密。

接下来我们封装一个响应工具类备用,这个大家如果经常看松哥视频已经很了解了:


  1. public class RespBean { 
  2.     private Integer status; 
  3.     private String msg; 
  4.     private Object obj; 
  5.  
  6.     public static RespBean build() { 
  7.         return new RespBean(); 
  8.     } 
  9.  
  10.     public static RespBean ok(String msg) { 
  11.         return new RespBean(200, msg, null); 
  12.     } 
  13.  
  14.     public static RespBean ok(String msg, Object obj) { 
  15.         return new RespBean(200, msg, obj); 
  16.     } 
  17.  
  18.     public static RespBean error(String msg) { 
  19.         return new RespBean(500, msg, null); 
  20.     } 
  21.  
  22.     public static RespBean error(String msg, Object obj) { 
  23.         return new RespBean(500, msg, obj); 
  24.     } 
  25.  
  26.     private RespBean() { 
  27.     } 
  28.  
  29.     private RespBean(Integer status, String msg, Object obj) { 
  30.         this.status = status; 
  31.         this.msg = msg; 
  32.         this.obj = obj; 
  33.     } 
  34.  
  35.     public Integer getStatus() { 
  36.         return status; 
  37.     } 
  38.  
  39.     public RespBean setStatus(Integer status) { 
  40.         this.status = status; 
  41.         return this; 
  42.     } 
  43.  
  44.     public String getMsg() { 
  45.         return msg; 
  46.     } 
  47.  
  48.     public RespBean setMsg(String msg) { 
  49.         this.msg = msg; 
  50.         return this; 
  51.     } 
  52.  
  53.     public Object getObj() { 
  54.         return obj; 
  55.     } 
  56.  
  57.     public RespBean setObj(Object obj) { 
  58.         this.obj = obj; 
  59.         return this; 
  60.     } 
【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章