PopularMVC框架请求响应数据加解密@Decrypt和@Encrypt的使⽤⽰例简介
此项⽬⽤于演⽰popularmvc如何提供统⼀全⾃动化的API隐私数据保护,并且可以做到业务⽆感和灵活指定数据加解密算法。
请求数据加密使⽤@Decrypt注解,响应信息加密使⽤@Encrypt注解,使⽤⾃定义算法进⾏加解密请实现DataEncryptHandler接⼝,注解中指定即可。
1. 请求数据解密
2. 响应信息加密
3. 指定⾃定义解密算法
4. 指定⾃定义加密算法
项⽬⽰例
1 项⽬结构
项⽬结构
│  l
│README.md
├─src
│├─main
││├─java
│││└─com
│││└─danyuanblog
│││└─framework
│││└─demo
│││└─popularmvc
││││StartDemoApplication.java
││││
│││├─component
││││RSADataEncryptHandler.java
││││
│││├─controller
│││││TestCustomEncryptAndDecryptController.java
│││││TestEncryptAndDecryptController.java
│││││
││││└─dto
││││UserInfoDto.java
││││
│││└─utils
│││RSAEncryptUtil.java
│││
││└─resources
││          l
││
│└─test
│└─java
│└─com
│└─danyuanblog
│└─framework
│└─popular
│└─mvc
└─target
├─classes
││  l
││
││
│└─com
│└─danyuanblog
│└─framework
│└─demo
│└─popularmvc
││StartDemoApplication.class
││
│├─component
││RSADataEncryptHandler.class
││
│├─controller
│││TestCustomEncryptAndDecryptController.class
│││TestEncryptAndDecryptController.class
│││
││└─dto
││UserInfoDto.class
││
│└─utils
│RSAEncryptUtil.class
└─test-classes
└─com
└─danyuanblog
└─framework
└─popular
└─mvc
引⼊模块依赖,在l添加
<dependency>
<groupId>com.danyuanblog.framework</groupId>
<artifactId>popular-web-mvc</artifactId>
<version>${popular-web-mvc.version}</version>
</dependency>
2 启⽤PopularMvc框架
/**
* Title StartDemoApplication.java
* Description
* @author danyuan
* @date Oct 31, 2020
* @version 1.0.0
* site: www.danyuanblog
*/
package com.danyuanblog.framework.demo.popularmvc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.danyuanblog.framework.popularmvc.annotation.EnablePopularMvc;
@SpringBootApplication
@EnablePopularMvc
public class StartDemoApplication {
public static void main(String[] args){
SpringApplication.run(StartDemoApplication.class, args);
}
}
3 配置信息
秘钥信息配置如下l
popularmvc:
api:
channels:
default:#⽤于不区分渠道信息的应⽤
default:#默认的秘钥信息
enable:true
#⽤于对称加解密、⽣成数字签名、验证数字签名的秘钥
secret:"123456"
keyPair:#⽤于⾮对称加解密的秘钥对
privateSecret:"MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAIZjqviU3YAn3yOftco++Ya+KcuE6hC3scAvh7CoC4bgYTAqWZhNm dXOu4I5jzd2rhz2r6E6CInRhhY+m9kRIKN8GKP7hsG2/GibY/iK304zxqetzhvX9jd8D/f9riTqd6N09g3zBkmh6XUBvbha52Xksi4UzXJhV3ZVgfWv1t4nAgMBAA ECgYByVrQtQQLfuYypE4Yo58GHOZ33sUMwLAoImKfazm7YN2mZAD8wTL3Y4kY4ut418zyaGew9wVFoaKKrpGMWoPLhvZiMZGb92r5SIb4C9gI3S6XHK YoOaVXi8oSTkCF0duoSQdCy3w3CGZbdfTEO/qtT25CePyGB2c1bYj0VULUm2QJBAPTzhh5ndTyuGiV+wbnWk6x6gcONNUGpTuvdGkcNBw/fn6QAA44CA +LKdFOMDB2QQmO3vF/JhQEjG6L4mbq8A6UCQQCMc3l40RwRypJ3A9RbwrYtO1c0X2VHdGCpi1L4FMxLWdTB0c7y9HbbXcJdL0L3Bl48Go0bwzzNSkfr2 vqR9MDbAkBcZqjHO1u8QijW0BQgGFOokqX0sIXQeR+uVb+d4coyMLc11FOC9DunB5wOEBxZ4ptIpnzG3Wvw29+HAKRtDpOJAkBwoBSTTlPM7H0glOCQ KIY/pSsbozeq4ea1bjS9HKhp8AIM3jquVlyNMhUu9jwjrGaamcv3rEqwcFVWC0YNDpArAkBYjalgYWGq6hRTjYSYJ82mdHy2EGxGhBkq51U871uaReP8c/a5w GjxPEyZMclF5+fpfFTwD+F8JZReVqa70eh6df723820"
publicSecret:"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCGY6r4lN2AJ98jn7XKPvmGvinLhOoQt7HAL4ewqAuG4GEwKlmYTZnVzruCO
Y83dq4c9q+hOgiJ0YYWPpvZESCjfBij+4bBtvxom2P4it9OM8anrc4b1/Y3fA/3/a4k6nejdPYN8wZJoel1Ab24Wudl5LIuFM1yYVd2VYH1r9beJwIDAQAB"
mvc的controllerappId1:#某个应⽤下的秘钥信息
enable:true
#⽤于对称加解密、⽣成数字签名、验证数字签名的秘钥
secret:"123456"
keyPair:#⽤于⾮对称加解密的秘钥对
privateSecret:""
publicSecret:""
android:
default:
enable:true
#⽤于对称加解密、⽣成数字签名、验证数字签名的秘钥
secret:"123456"
keyPair:#⽤于⾮对称加解密的秘钥对
privateSecret:""
publicSecret:""
ios:
default:
enable:true
secret:"12345678"
keyPair:
privateSecret:""
publicSecret:""
4 演⽰代码解析
4.1 使⽤默认的AES进⾏加解密
API数据的加解密的使⽤主要分两种应⽤场景:
1. 对api调⽤者传递过来的接⼝请求内的隐私信息进⾏解密,然后交由业务去处理,popularmvc对业务屏蔽了加解密的过程,业务
可以直接使⽤明⽂进⾏处理
2. 将API返回隐私信息加密后再返回给接⼝调⽤者,接⼝调⽤者拿到后再进⾏解密后处理
⽰例代码如下所⽰。
接⼝源码TestEncryptAndDecryptController.java
/**
* Title TestEncryptAndDecryptController.java
* Description
* @author danyuan
* @date Jan 4, 2021
* @version 1.0.0
* site: www.danyuanblog
*/
package com.danyuanblog.framework.ller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import java.util.ArrayList;
import java.util.List;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.danyuanblog.framework.ller.dto.UserInfoDto;
import com.danyuanblog.framework.popularmvc.annotation.Decrypt;
import com.danyuanblog.framework.popularmvc.annotation.Encrypt;
@Api(tags ="测试接⼝数据安全传输功能")
@RestController
public class TestEncryptAndDecryptController {
@GetMapping(value="testDecryptParamAndResponse",
name="测试加解密普通参数和响应信息")
@ApiOperation(value="测试加解密普通参数和响应信息", notes="测试加解密普通参数和响应信息")
@Encrypt
public UserInfoDto testDecryptParamAndResponse(@RequestParam("desc")@Decrypt String desc){  UserInfoDto user =new UserInfoDto();
user.setUsername("danyuan");
user.setAge(18);
user.setDesc("this is a encrypt test .");
return user;
}
@GetMapping(value="testEncryptListResponseData",
name="测试加密列表响应信息")
@ApiOperation(value="测试加密列表响应信息", notes="测试加密列表响应信息")
public List<UserInfoDto>testEncryptListResponseData(){
List<UserInfoDto> list =new ArrayList<>();
UserInfoDto user1 =new UserInfoDto();
user1.setUsername("danyuan");
user1.setAge(18);
user1.setDesc("this is a encrypt test 1 .");
UserInfoDto user2 =new UserInfoDto();
user2.setUsername("⼩明");
user2.setAge(22);
user2.setDesc("this is a encrypt test 2 .");
list.add(user1);
list.add(user2);
return list;
}
@GetMapping(value="testEncryptStringResponse")
@ApiOperation(value="测试加密字符串响应信息", notes="测试加密字符串响应信息")
@Encrypt
public String testEncryptStringResponse(){
return"This just a string response encrypt test !";
}
}
⽤到的DTO信息
UserInfoDto.java
/**
* Title UserInfoDto.java
* Description
* @author danyuan
* @date Nov 29, 2020
* @version 1.0.0
* site: www.danyuanblog
*/
package com.danyuanblog.framework.ller.dto;
import java.io.Serializable;
import java.util.List;
import com.danyuanblog.framework.popularmvc.annotation.Encrypt;
import lombok.Data;
@Data
public class UserInfoDto implements Serializable{/**
*serialVersionUID
*/
private static final long serialVersionUID =1L;
private String username;
private Integer age;
@Encrypt
private String desc;
private List<UserInfoDto> friends;
}
4.2 使⽤⾃定义的算法进⾏加解密