大数跨境
0
0

基于Spring Boot一个注解实现加解密与签名【非常详细】

基于Spring Boot一个注解实现加解密与签名【非常详细】 Spring全家桶实战案例
2024-11-06
0
导读:基于Spring Boot一个注解实现加解密与签名【非常详细】

最新实战案例锦集:《Spring Boot3实战案例合集》持续更新,每天至少更新一篇文章,订阅后将赠送文章最后展示的所有MD文档(学习笔记)。

环境:SpringBoot2.7.18 + SpringCloud2021.0.9



1. 简介

数据的安全性是至关重要的。随着网络安全威胁的不断增加,确保数据在传输和存储过程中的完整性和保密性变得尤为重要。加解密和签名技术是保障数据安全的有效手段。加解密技术可以保护数据的隐私,防止数据在传输过程中被窃取;而签名技术则可以确保数据的完整性和来源的真实性,防止数据被篡改或伪造。

基于Spring Boot的注解实现加解密与签名,旨在为开发者提供一种简便且高效的方式来集成这些安全机制。Spring Boot的注解机制使得开发者可以在不改变原有业务逻辑的情况下,通过简单的注解声明来实现数据的加解密和签名。这种方法不仅提高了代码的可读性和可维护性,还减少了开发和测试的复杂度。

本篇文章主要完成以下功能:

  1. 响应数据进行加密后输出

  2. 请求数据自动进行解密处理

  3. 响应数据自动生成签名信息

       

使用的技术:

  • 自定义注解

  • 加解密技术(MD5、AES)

  • 自定义RequestBodyAdvice 与 ResponseBodyAdvice


接下来,我们将详细的介绍基于 Spring Boot 实现数据的加解密与签名。

2. 实战案例

2.1 自定义注解

我们会自定义3个注解,分别用来解密请求数据,加密响应数据,生成响应签名信息。

解密请求数据注解

@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD, ElementType.TYPE})public @interface DecryptRequest {}

加密响应数据注解

@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD, ElementType.TYPE})public @interface 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 {
@Override 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) ; }  } @Override 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 {
@Override 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 {
@Override protected String getAlgorithm() { return "MD5" ; }}

加解密算法实现有了,我们还需要准备一些工具类,工具类用来进行16进制的转换及生成签名的原始数据。

【声明】内容源于网络
0
0
Spring全家桶实战案例
Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
内容 832
粉丝 0
Spring全家桶实战案例 Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
总阅读38
粉丝0
内容832