首先我想说明一下本次攻略的目的和背景。随着网络技术的快速发展,很多 web 应用都包含了用户敏感信息,数据的安全性也变得越来越重要。而其中一个解决方案就是加密和签名校验。SpringBoot 作为一个主流的开发框架,提供了各种扩展点,开发人员可以通过自定义注解来实现各种功能,其中就包括 API 数据加密和签名校验。我们的攻略就是基于 SpringBoot 自定义注解,来实现 API 数据加密和签名校验。
步骤:
-
了解 SpringBoot 自定义注解的基本知识。可以参考官方文档和相关博客。
-
定义一个注解 @EncryptAndSign,用于标识需要加密和签名校验的 API 方法的参数和返回值。可以采用如下方式定义注解:
java
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface EncryptAndSign {
}
- 定义一个切面类 EncryptAndSignAspect,用于实现加密和签名校验的逻辑。可以采用如下方式定义切面类:
```java
@Aspect
@Component
public class EncryptAndSignAspect {
@Around("@annotation(com.example.demo.annotation.EncryptAndSign)")
public Object encryptAndSign(ProceedingJoinPoint joinPoint) throws Throwable {
// 获取方法参数和返回值
Object[] args = joinPoint.getArgs();
Object result = joinPoint.proceed(args);
// 加密和签名校验逻辑
// ...
return result;
}
}
```
- 在所需的 API 方法上添加注解 @EncryptAndSign。例如:
java
@RequestMapping(value = "/user", method = RequestMethod.GET)
@EncryptAndSign
public User getUserInfo(@RequestParam("userId") String userId) {
// 获取用户信息逻辑
User user = userService.getUserById(userId);
return user;
}
- 在 application.yml 文件中配置加密和签名校验所需的相关参数。例如:
yaml
encrypt-and-sign:
aes-key: "1234567890123456"
sign-secret: "abcdefg123456789"
其中 aes-key 是 AES 加密算法的密钥,sign-secret 是签名算法所需的密钥。
- 实现加密和签名校验的具体逻辑。可以参考以下示例代码:
```java
public class EncryptAndSignUtils {
private static final String UTF_8 = "UTF-8";
private static final String AES = "AES";
private static final String SIGN_ALGORITHM = "HmacSHA256";
private static String aesKey;
private static String signSecret;
public static void init(String aesKey, String signSecret) {
EncryptAndSignUtils.aesKey = aesKey;
EncryptAndSignUtils.signSecret = signSecret;
}
/**
* 对字符串进行 AES 加密
*/
public static String encrypt(String content) {
try {
KeyGenerator keyGenerator = KeyGenerator.getInstance(AES);
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(aesKey.getBytes());
keyGenerator.init(128, secureRandom);
SecretKey secretKey = keyGenerator.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, AES);
Cipher cipher = Cipher.getInstance(AES);// 创建密码器
byte[] byteContent = content.getBytes(UTF_8);
cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
byte[] result = cipher.doFinal(byteContent);// 加密
return Base64.encodeBase64String(result);// base64 编码
} catch (Exception e) {
throw new RuntimeException("AES 加密失败", e);
}
}
/**
* 对字符串进行签名
*/
public static String sign(String content) {
try {
Mac mac = Mac.getInstance(SIGN_ALGORITHM);
SecretKeySpec secretKey = new SecretKeySpec(signSecret.getBytes(UTF_8), SIGN_ALGORITHM);
mac.init(secretKey);
byte[] hmacData = mac.doFinal(content.getBytes(UTF_8));
return Hex.encodeHexString(hmacData);
} catch (Exception e) {
throw new RuntimeException("签名计算失败", e);
}
}
/**
* 验证签名
*/
public static boolean verify(String content, String sign) {
String expected = sign(content);
return expected.equals(sign);
}
}
```
其中 encrypt 方法使用了 AES 加密算法对原字符串进行加密,sign 方法使用了 HmacSHA256 算法对原字符串进行签名,verify 方法用于校验签名是否正确。
到此为止,我们就完成了使用自定义注解来实现 API 数据加密和签名校验的步骤。接下来,我将给出两个具体的实例。
示例一:
我们需要对一条查询用户信息的 API 进行加密和签名校验。代码如下:
@RequestMapping(value = "/user", method = RequestMethod.GET)
@EncryptAndSign
public User getUserInfo(@RequestParam("userId") String userId) {
// 获取用户信息逻辑
User user = userService.getUserById(userId);
return user;
}
在 application.yml 文件中增加如下配置:
encrypt-and-sign:
aes-key: "1234567890123456"
sign-secret: "abcdefg123456789"
我们可以采用 Postman 等工具进行测试。请求 URL 为 http://localhost:8080/user,参数 userId 值为 1,请求 header 中添加字段 Content-Type 为 application/json。请求 body 为空。
示例二:
我们需要对一条修改用户信息的 API 进行加密和签名校验。代码如下:
@RequestMapping(value = "/user", method = RequestMethod.PUT)
@EncryptAndSign
public void updateUserInfo(@RequestBody User user) {
// 修改用户信息逻辑
userService.updateUser(user);
}
在 application.yml 文件中增加如下配置:
encrypt-and-sign:
aes-key: "1234567890123456"
sign-secret: "abcdefg123456789"
我们可以采用 Postman 等工具进行测试。请求 URL 为 http://localhost:8080/user,请求 header 中添加字段 Content-Type 为 application/json,请求 body 中添加需要修改的用户信息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot自定义注解API数据加密和签名校验 - Python技术站