API数据加密框架monkey-api-encrypt
-
内置AES加密算法,可以配置不同的加密key
-
不再绑定Spring Boot,通过配置Filter即可使用加解密
-
Spring Cloud Zuul框架也可以支持
-
支持用户自定义加密算法
GitHub地址:https://github.com/yinjihuan/monkey-api-encrypt
示例代码:https://github.com/yinjihuan/monkey-api-encrypt/tree/master/encrypt-springboot-example
monkey-api-encrypt没有发布到Maven中央仓库,只发布到jitpack这个仓库,大家也可以自行下载源码打包传到自己公司的私服上。
自动加解密的好处
传统做法如下:
-
// 客户端传来的数据就是加密好的字符串
-
public String add(String data) {
-
// 1. 通过工具类将数据解密,然后序列化成对象使用
-
// 2. 处理业务逻辑,数据返回的时候用工具类将数据加密返回给客户端
-
}
缺点是在每个业务方法中都要手动的去处理加解密的逻辑。
通过使用monkey-api-encrypt的话可以让开发人员不需要关注加解密的逻辑,比如:
-
@PostMapping("/save")
-
public UserResult add(@RequestBody User data) {
-
UserResult result = new UserResult ();
-
result.setXXX....
-
return result;
-
}
上面的代码跟平常写的一模一样,没有加解密的逻辑,需要对数据做加解密逻辑的时候,只需要配置一个过滤器,然后指定哪些URI需要加解密即可。下面来学习下如何使用monkey-api-encrypt。
快速使用
下面以jitpack仓库示列
第一步:pom.xml中增加仓库地址
-
<repositories>
-
<repository>
-
<id>jitpack.io</id>
-
<url>https://jitpack.io</url>
-
</repository>
-
</repositories>
第二步:增加项目依赖
-
<dependency>
-
<groupId>com.github.yinjihuan</groupId>
-
<artifactId>monkey-api-encrypt</artifactId>
-
<version>1.1.1</version>
-
</dependency>
第三步:配置加解密过滤器(Spring Boot中配置方式)
-
@Configuration
-
public class FilterConfig {
-
@Bean
-
public FilterRegistrationBean<EncryptionFilter> filterRegistration() {
-
EncryptionConfig config = new EncryptionConfig();
-
config.setKey("abcdef0123456789");
-
config.setRequestDecyptUriList(Arrays.asList("/save", "/decryptEntityXml"));
-
config.setResponseEncryptUriList(Arrays.asList("/encryptStr", "/encryptEntity", "/save", "/encryptEntityXml", "/decryptEntityXml"));
-
FilterRegistrationBean<EncryptionFilter> registration = new FilterRegistrationBean<EncryptionFilter>();
-
registration.setFilter(new EncryptionFilter(config));
-
registration.addUrlPatterns("/*");
-
registration.setName("EncryptionFilter");
-
registration.setOrder(1);
-
return registration;
-
}
-
}
-
EncryptionConfig EncryptionConfig是加解密的配置类,配置项目定义如下:
-
public class EncryptionConfig {
-
/**
-
* AES加密Key,长度必须16
-
*/
-
private String key = "d7b85f6e214abcda";
-
/**
-
* 需要对响应内容进行加密的接口URI<br>
-
* 比如:/user/list<br>
-
* 不支持@PathVariable格式的URI
-
*/
-
private List<String> responseEncryptUriList = new ArrayList<String>();
-
/**
-
* 需要对请求内容进行解密的接口URI<br>
-
* 比如:/user/list<br>
-
* 不支持@PathVariable格式的URI
-
*/
-
private List<String> requestDecyptUriList = new ArrayList<String>();
-
/**
-
* 响应数据编码
-
*/
-
private String responseCharset = "UTF-8";
-
/**
-
* 开启调试模式,调试模式下不进行加解密操作,用于像Swagger这种在线API测试场景
-
*/
-
private boolean debug = false;
-
}
自定义加密算法
内置了AES加密算法对数据进行加解密操作,同时用户可以自定义算法来代替内置的算法。
自定义算法需要实现EncryptAlgorithm接口:
-
/**
-
* 自定义RSA算法
-
*
-
* @author yinjihuan
-
*
-
* @date 2019-01-12
-
*
-
* @about http://cxytiandi.com/about
-
*
-
*/
-
public class RsaEncryptAlgorithm implements EncryptAlgorithm {
-
public String encrypt(String content, String encryptKey) throws Exception {
-
return RSAUtils.encryptByPublicKey(content);
-
}
-
public String decrypt(String encryptStr, String decryptKey) throws Exception {
-
return RSAUtils.decryptByPrivateKey(encryptStr);
-
}
-
}
注册Filter的时候指定算法:
-
EncryptionConfig config = new EncryptionConfig();
-
registration.setFilter(new EncryptionFilter(config, new RsaEncry