最新实战案例锦集:《Spring Boot3实战案例合集》持续更新,每天至少更新一篇文章,订阅后将赠送文章最后展示的所有MD文档(学习笔记)。
环境:SpringBoot2.7.18 + SpringCloud2021.0.9
1. 简介
数据的安全性是至关重要的。随着网络安全威胁的不断增加,确保数据在传输和存储过程中的完整性和保密性变得尤为重要。加解密和签名技术是保障数据安全的有效手段。加解密技术可以保护数据的隐私,防止数据在传输过程中被窃取;而签名技术则可以确保数据的完整性和来源的真实性,防止数据被篡改或伪造。
基于Spring Boot的注解实现加解密与签名,旨在为开发者提供一种简便且高效的方式来集成这些安全机制。Spring Boot的注解机制使得开发者可以在不改变原有业务逻辑的情况下,通过简单的注解声明来实现数据的加解密和签名。这种方法不仅提高了代码的可读性和可维护性,还减少了开发和测试的复杂度。
本篇文章主要完成以下功能:
响应数据进行加密后输出
请求数据自动进行解密处理
响应数据自动生成签名信息
使用的技术:
自定义注解
加解密技术(MD5、AES)
自定义RequestBodyAdvice 与 ResponseBodyAdvice
接下来,我们将详细的介绍基于 Spring Boot 实现数据的加解密与签名。
2. 实战案例
2.1 自定义注解
我们会自定义3个注解,分别用来解密请求数据,加密响应数据,生成响应签名信息。
解密请求数据注解
@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD, ElementType.TYPE})public @interface DecryptRequest {}
加密响应数据注解
public EncryptResponse {}
生成响应签名数据注解
@Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface Signature {}
为了更加的完善,你可以在注解上添加自己的注解,比如单独控制使用什么加解密算法,控制是否进行数据的处理等等。
2.2 加解密 / 签名算法实现
接口定义
// 加解密接口public interface CryptResolver {String encrypt(String secret, String source) ;String decrypt(String secret, String source) ;}// 数据签名接口public interface SignatureResolver {String signature(Object source) ;}
具体算法实现
// 加解密算法的抽象类实现,具体什么算法由子类定义public abstract class AbstractCryptResolver implements CryptResolver {public final String encrypt(String secret, String source) {try {Cipher cipher = Cipher.getInstance(getAlgorithm()) ;cipher.init(Cipher.ENCRYPT_MODE, secretKey(secret)) ;return Hex.encode(cipher.doFinal(source.getBytes())) ;} catch (Exception e) {throw new RuntimeException(e) ;}}public final String decrypt(String secret, String encrtptText) {try {Cipher cipher = Cipher.getInstance(getAlgorithm()) ;cipher.init(Cipher.DECRYPT_MODE, secretKey(secret)) ;return new String(cipher.doFinal(Hex.decode(encrtptText))) ;} catch (Exception e) {throw new RuntimeException(e) ;}}protected abstract String getAlgorithm() ;private Key secretKey(String secret) {byte[] keys = Arrays.copyOf(secret.getBytes(), 16) ;return new SecretKeySpec(keys, getAlgorithm()) ;}}public class AESCryptResolver extends AbstractCryptResolver {// 关于对称加密算法;还设计到了模式和填充,在实际开发中应该考虑到protected String getAlgorithm() {return "AES" ;}}// 签名算法实现public abstract class AbstractSignatureResolver implements SignatureResolver {public String signature(Object source) {try {MessageDigest md = MessageDigest.getInstance(getAlgorithm()) ;byte[] ret = md.digest(HashUtils.genHashContent(source).getBytes(StandardCharsets.UTF_8)) ;return Hex.encode(ret) ;} catch (Exception e) {throw new RuntimeException(e) ;}}protected abstract String getAlgorithm() ;}public class MD5SignatureResolver extends AbstractSignatureResolver {protected String getAlgorithm() {return "MD5" ;}}
加解密算法实现有了,我们还需要准备一些工具类,工具类用来进行16进制的转换及生成签名的原始数据。


