SpringBoot进行数据加密和解密的详细指南

 更新时间:2024年11月14日 10:00:29   作者:微特尔普拉斯  
对称加密算法使用相同的密钥进行加密和解密,其主要优点包括速度快和实现简单,常见的对称加密算法有 AES、DES 等,本文将以 AES 为例,展示如何在 Spring Boot 项目中进行数据加密和解密,需要的朋友可以参考下

在现代软件开发中,数据加密和解密是保护敏感信息的重要手段。本文将介绍如何在 Spring Boot 项目中使用 Java 的 SecretKeySpec 和 Cipher 类来实现对称加密和解密。

为什么选择对称加密?

对称加密算法使用相同的密钥进行加密和解密。其主要优点包括速度快和实现简单。常见的对称加密算法有 AES、DES 等。本文将以 AES 为例,展示如何在 Spring Boot 项目中进行数据加密和解密。

对称加密

概念

对称加密(Symmetric Encryption)是一种使用单一密钥(即同一密钥)进行加密和解密的加密方法。加密和解密过程使用相同的密钥,因此加密方和解密方都必须拥有该密钥。

特点

  • 速度快:对称加密算法通常比非对称加密算法快,因为它们的计算复杂度较低。
  • 容易实现:对称加密算法的实现相对简单,且计算效率高。
  • 密钥管理复杂:由于加密和解密使用相同的密钥,密钥的分发和管理非常重要且复杂。密钥泄露将导致加密数据的安全性受到威胁。

常见算法

  • AES(Advanced Encryption Standard)
  • DES(Data Encryption Standard)
  • 3DES(Triple DES)
  • RC4(Rivest Cipher 4)
  • Blowfish

应用场景

  • 数据库加密
  • 文件加密
  • 网络通信中的数据加密(如HTTPS中的对称加密部分)

非对称加密

概念

非对称加密(Asymmetric Encryption)是一种使用一对密钥(公钥和私钥)进行加密和解密的加密方法。公钥用于加密,私钥用于解密。公钥可以公开发布,而私钥必须保密。

特点

  1. 安全性高:由于使用公钥和私钥对,私钥不需要在通信双方之间传递,因此安全性更高。
  2. 速度慢:非对称加密算法通常比对称加密算法慢,因为它们的计算复杂度较高。
  3. 密钥管理简单:由于公钥可以公开,只有私钥需要保密,所以密钥管理相对简单。

常见算法

  • RSA(Rivest-Shamir-Adleman)
  • DSA(Digital Signature Algorithm)
  • ECC(Elliptic Curve Cryptography)

应用场景

  • 数字签名:验证数据的来源和完整性。
  • 密钥交换:在安全通道中交换对称加密的密钥,如TLS/SSL协议。
  • 电子邮件加密:如PGP(Pretty Good Privacy)。

对比总结

  • 密钥使用
    • 对称加密使用相同的密钥进行加密和解密。
    • 非对称加密使用一对密钥(公钥和私钥)进行加密和解密。
  • 速度
    • 对称加密速度快,适合大数据量的加密。
    • 非对称加密速度慢,通常用于少量数据的加密或密钥交换。
  • 安全性
    • 对称加密密钥管理复杂,密钥泄露风险较大。
    • 非对称加密安全性高,适合公开密钥的场景。

实际应用结合

在实际应用中,常常将对称加密和非对称加密结合使用。例如,在HTTPS协议中,首先使用非对称加密进行密钥交换,然后使用对称加密进行数据传输。这样既保证了密钥的安全性,又提高了数据传输的效率。

项目设置

首先,确保你的 Spring Boot 项目已经创建并运行。你可以使用 Spring Initializr 或者你的 IDE 快速创建一个新的 Spring Boot 项目。

添加依赖

在 pom.xml 文件中添加以下依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starterartifactId>
    dependency>
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-webartifactId>
    dependency>
<dependencies>

创建加密和解密工具类

接下来,我们创建一个工具类 CryptoUtil,用于实现加密和解密功能。

package com.example.demo.util;
 
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
 
public class CryptoUtil {
 
    private static final String ALGORITHM = "AES";
    private static final String TRANSFORMATION = "AES";
 
    // 16-byte secret key
    private static final String SECRET_KEY = "mySuperSecretKey";
 
    public static String encrypt(String input) throws Exception {
        SecretKeySpec keySpec = new SecretKeySpec(SECRET_KEY.getBytes(), ALGORITHM);
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        cipher.init(Cipher.ENCRYPT_MODE, keySpec);
 
        byte[] encryptedBytes = cipher.doFinal(input.getBytes());
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }
 
    public static String decrypt(String input) throws Exception {
        SecretKeySpec keySpec = new SecretKeySpec(SECRET_KEY.getBytes(), ALGORITHM);
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        cipher.init(Cipher.DECRYPT_MODE, keySpec);
 
        byte[] decodedBytes = Base64.getDecoder().decode(input);
        byte[] decryptedBytes = cipher.doFinal(decodedBytes);
        return new String(decryptedBytes);
    }
}

创建 REST 控制器

接下来,我们创建一个 REST 控制器来测试加密和解密功能。

package com.example.demo.controller;
 
import com.example.demo.util.CryptoUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class CryptoController {
 
    @GetMapping("/encrypt")
    public String encrypt(@RequestParam String plaintext) {
        try {
            return CryptoUtil.encrypt(plaintext);
        } catch (Exception e) {
            e.printStackTrace();
            return "Error encrypting data";
        }
    }
 
    @GetMapping("/decrypt")
    public String decrypt(@RequestParam String ciphertext) {
        try {
            return CryptoUtil.decrypt(ciphertext);
        } catch (Exception e) {
            e.printStackTrace();
            return "Error decrypting data";
        }
    }
}

测试加密和解密

启动 Spring Boot 应用,并使用浏览器或者 Postman 访问以下 URL:

  • 加密:
http://localhost:8080/encrypt?plaintext=HelloWorld
  • 你将会得到一个加密后的字符串,例如:
YWJjZGVmZ2hpamtsbW5vcHFy
  • 解密:
http://localhost:8080/decrypt?ciphertext=YWJjZGVmZ2hpamtsbW5vcHFy
  • 你将会得到解密后的原文:
HelloWorld

总结

通过本文,你学会了如何在 Spring Boot 项目中使用 SecretKeySpec 和 Cipher 实现对称加密和解密。我们使用 AES 算法对字符串进行加密和解密,并通过 REST 控制器来测试这些功能。

以上就是SpringBoot进行数据加密和解密的详细指南的详细内容,更多关于SpringBoot数据加密和解密的资料请关注脚本之家其它相关文章!

相关文章

  • Java 链表实战真题训练

    Java 链表实战真题训练

    跟着思路走,之后从简单题入手,反复去看,做过之后可能会忘记,之后再做一次,记不住就反复做,反复寻求思路和规律,慢慢积累就会发现质的变化
    2022-04-04
  • Java数组的定义与使用

    Java数组的定义与使用

    数组是有序的元素序列,若将有限个类型相同的变量的集合命名,那么这个名称为数组名。本文通过代码示例详细介绍了Java数组的定义和使用,对学习或工作有一定的帮助,需要的小伙伴欢迎阅读
    2023-04-04
  • Java使用POI库快速生成Word文档的方法详解

    Java使用POI库快速生成Word文档的方法详解

    这篇文章主要介绍了Java使用POI库快速生成Word文档的方法,Java POI库是一个开源的Java库,能够用来读写Microsoft Office格式的文件,尤其在处理文档和电子表格方面功能强大,需要的朋友可以参考下
    2025-10-10
  • Spring中的Context你真的懂了吗

    Spring中的Context你真的懂了吗

    这篇文章主要给大家介绍了关于Spring中Context的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • java中char类型转换成int类型的2种方法

    java中char类型转换成int类型的2种方法

    这篇文章主要给大家介绍了关于java中char类型转换成int类型的2种方法,因为java是一门强类型语言,所以在数据运算中会存在类型转换,需要的朋友可以参考下
    2023-07-07
  • 基于SpringBoot + 七牛云 + Quartz实现图片存储与定时清理

    基于SpringBoot + 七牛云 + Quartz实现图片存储与定时清理

    这篇文章主要介绍了在实际项目中使用七牛云对象存储进行图片存储的方法,以及如何实现套餐管理(包括图片上传和多对多关联检查组)的前端和后端功能,此外,还详细讲解了如何使用Quartz定时任务组件自动清理垃圾图片,以节省存储资源,需要的朋友可以参考下
    2026-04-04
  • Java实现本地缓存的方式汇总

    Java实现本地缓存的方式汇总

    引入缓存,主要用于实现系统的高性能,高并发,这篇文章主要介绍了Java实现本地缓存的几种方式,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • java开发AOP面向切面编程入门

    java开发AOP面向切面编程入门

    这篇文章主要介绍了java开发的AOP面向切面编程入门的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步学有所得
    2021-10-10
  • Java语法中Lambda表达式无法抛出异常的解决

    Java语法中Lambda表达式无法抛出异常的解决

    这篇文章主要介绍了Java语法中Lambda表达式无法抛出异常的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • java基于servlet的文件异步上传

    java基于servlet的文件异步上传

    本篇文章主要介绍了java基于servlet的文件异步上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-10-10

最新评论