SpringBoot 快速实现 API 加密,一个轮子搞定!
在项目中,为了保证数据的安全,我们常常会对传递的数据进行加密。常用的加密算法包括对称加密(AES)和非对称加密(RSA)。今天我们选取码云上最简单的 API 加密项目进行讲解,让你快速在 Spring Boot 中实现 API 接口的加解密。
什么是 RSA 加密?
首先我们来了解一下 RSA 加密。
RSA 加密是一种非对称加密。可以在不直接传递密钥的情况下,完成解密。这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险。是由一对密钥来进行加解密的过程,分别称为公钥和私钥。
该加密算法的原理就是对一极大整数做因数分解的困难性来保证安全性。通常个人保存私钥,公钥是公开的。

加密和签名都是为了安全性考虑,但略有不同。简单的说,加密是为了防止信息被泄露,而签名是为了防止信息被篡改。在实际应用中,要根据情况使用,也可以同时使用加密和签名,达到既不泄露也不被篡改,更能保证消息的安全性。
加密实战准备
博主你哔哩哔哩这么多,我已经知道了 RSA 是干什么了。不就是公钥加密、私钥解密、私钥签名、公钥验签嘛。下面我们直接进入实战。
1、新建 Spring Boot 项目并引入依赖
首先创建一个标准的 Spring Boot 项目,然后引入 API 加密的 Maven 依赖:

<dependency>
<groupId>cn.shuibo</groupId>
<artifactId>rsa-encrypt-body-spring-boot</artifactId>
<version>1.0.1.RELEASE</version>
</dependency>
2、启动类添加注解
在启动类 Application 中添加 @EnableSecurity 注解,开启加密功能:
@SpringBootApplication
@EnableSecurity
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
3、在配置文件中添加密钥
在 application.yml 或 application.properties 中添加 RSA 公钥及私钥。公钥私钥可以使用相关软件生成。
rsa:
encrypt:
open: true # 是否开启加密
showLog: true # 是否打印加解密日志
publicKey: # 你的 RSA 公钥
privateKey: # 你的 RSA 私钥
API 接口加解密配置
1、对 Controller 接口进行加密
使用 @Encrypt 注解标记需要加密返回值的接口:
@Encrypt
@GetMapping("/encryption")
public TestBean encryption(){
TestBean testBean = new TestBean();
testBean.setName("shuibo.cn");
testBean.setAge(18);
return testBean;
}
启动项目访问该接口,你会发现返回的数据已经被自动加密了。
2、前端解密与回传
如果是其他 Spring Boot 项目请求,可以直接使用对应的解密组件。如果是前端(如 Vue 或原生 JS),请使用 RSA 密钥进行解密。前端只需要公钥即可。
引入 jsencrypt 库进行加密回传:
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/jsencrypt/3.0.0-rc.1/jsencrypt.js"></script>
编写前端加密和提交的方法:
var PUBLIC_KEY = '你的公钥字符串';
function RSA_encryption(jsonData) {
var encrypt = new JSEncrypt();
encrypt.setPublicKey('-----BEGIN PUBLIC KEY-----\n' + PUBLIC_KEY + '\n-----END PUBLIC KEY-----');
var encrypted = encrypt.encrypt(JSON.stringify(jsonData));
return encrypted;
}
function tijiao() {
var str = {
"name": "1223334",
"password": "asd",
"age": 1
};
$.ajax({
url: "/decryption",
type: "POST",
contentType: "application/json;charset=utf-8",
data: RSA_encryption(str),
success: function(data) {
alert("请求成功:" + data);
}
});
}
3、后台增加解密方法
后台接收前端传来的加密数据时,使用 @Decrypt 注解即可自动解密:
@PostMapping("/decryption")
@Decrypt
@ResponseBody
public String decryption(@RequestBody User user){
System.out.println("解密后的数据:" + user.toString());
return user.toString();
}
注意解密方法中的参数必须使用 @RequestBody 接收。
总结
经过上面的接口加密解密操作,可以看出我们的接口如果没有公钥或者私钥,别人根本无法解密。这样就对 API 接口起到了很好的保护作用,防止了恶意抓包分析。
踩坑提醒:
1. 前端 Ajax 请求的主意事项,contentType 必须为 "application/json;charset=utf-8"。
2. 后台解密方法接收参数时必须加上 @RequestBody。

长按二维码关注 “边学边练”