SpringBoot整合jasypt实现重要数据加密

2025-03-23 14:50

本文主要是介绍SpringBoot整合jasypt实现重要数据加密,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《SpringBoot整合jasypt实现重要数据加密》Jasypt是一个专注于简化Java加密操作的开源工具,:本文主要介绍详细介绍了如何使用jasypt实现重要数据加密,感兴趣的小伙伴可...

jasypt简介 

Jasypt(Java Simplified Encryption)是一个专注于简化Java加密操作的开源工具。它提供了一种简单而强大的方式来处理数据的加密和解密,使开发者能够轻松地保护应用程序中的敏感信息,如数据库密码、API密钥等。

Jasypt的设计理念是简化加密操作,使其对开发者更加友好。它采用密码学强度的加密算法,支持多种加密算法,从而平衡了性能和安全性。其中,Jasypt的核心思想之一是基于密码的加密(Password Based Encryption,PBE),通过用户提供的密码生成加密密钥,然后使用该密钥对数据进行加密和解密。此外,Jasypt还引入了盐(Salt)的概念,通过添加随机生成的盐值,提高了加密的安全性,防止相同的原始数据在不同的加密过程中产生相同的结果,有效抵御彩虹表攻击。

Jasypt的功能非常丰富,包括加密属性文件、Spring Framework集成、加密Hibernate数据源配置、URL加密的Apache Wicket集成等。它还可以与Acegi Security(即Spring Security)整合,用于加密任务与应用程序,如加密密码、敏感信息和数据通信,以及创建完整检查数据的sums等。此外,Jasypt还提供了一个开放的API,使得任何Java Cryptography Extension都可以使用它。

在Spring Boot应用中,Jasypt Spring Boot Starter是一个方便的集成工具,可以简化加密功能的配置。它支持多种加密算法,包括对称加密和非对称加密,可以根据实际需求选择合适的加密方式。通过使用Jasypt Spring Boot Starter,可以轻松地将加密功能集成到Spring Boot应用中,无需手动配置复杂的加密相关的代码和配置文件。

jasypt的优点

提供简单的单向(摘要)和双向加密技术。

用于任何JCE提供程序的开放API,而不仅仅是默认的Java VM提供程序。

为您的用户密码提供更高的安全性。

二进制加密支持。Jasypt允许对二进制文件(字节数组)进行摘要和加密。

数值加密支持。除了文本和二进制文件,它还允许对数值进行摘要和加密(BigInteger和BigDecimal,加密Hibernate持久性时支持其他数字类型)。
完全线程安全。

支持加密/摘要池,以在多处理器/多核系统中实现高性能。

包括库的轻量级(“精简”)版本,以便在移动平台等大小受限的环境中具有更好的可管理性。

SpringBoot使用jasypt

创建我需要的数据库文件

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `s_id` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
  `s_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
  `s_birth` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
  `s_sex` varchar(10) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
  PRIMARY KEY (`s_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Compact;
 
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('01', '赵雷', '1990-01-01', '男');
INSERT INTO `student` VALUES ('02', '钱电', '1990-12-21', '男');
INSERT INTO `student` VALUES ('03', '孙风', '1990-05-20', '男');
INSERT INTO `student` VALUES ('04', '李云', '1990-08-06', '男');
INSERT INTO `student` VALUES ('05', '周梅', '1991-12-01', '女');
INSERT INTO `student` VALUES ('06', '吴兰', '1992-03-01', '女');
INSERT INTO `student` VALUES ('07', '郑竹', '1989-07-01', '女');
INSERT INTO `student` VALUES ('08', '王菊', '1990-01-20', '女');
 
SET FOREIGN_KEY_CHECKS = 1;

引入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
 
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>tesjst</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.5</version>
        </dependency>
        <!--  引入核心依赖      -->
        <dependency>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>
       
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        
        <dependency>
            <groupId>com.baomidou</groupjsId>
            <http://www.chinasem.cnartifactId>myBATis-plus-boot-starter</artifactId>
            <version>3.5.2</version>
        </dependency>

配置数据库文件(先不进行加密)

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: 2020

创建mapper接口

这里使用的是MybatisPlus,如果不会使用,可以看我另一篇文章SpringBoot整合MybatisPlus的基本应用

@Mapper
public interface StudentMapper extends BaseMapper<Student> {
}

加下来进行进行测试。直接调用了mapper的selectList方法。

    @Resource
    StudentMapper studentMapper;
    @Test
    void findStudent(){
        List<Student> students = studentMapper.selectList(null);
        students.forEach(System.out::println);
    }

SpringBoot整合jasypt实现重要数据加密

结果也没问题。但我们这样把数据库密码暴露出来难免是不安全的,别人以看你的配置文件就知道你的数javascript据库密码,如果是你本地环境也就算了,但如果是你的服务器环境,一旦被别人知道了你的密码就糟糕了,所以接下来采用加密的方式展示配置文件中的一些内容。

配置文件加密 

引入依赖

jasypt:
  encryptor:
    #  采用的加密算法
    algorithm: PBEWITHHMACSHA512ANDAES_256
    # 盐粒
    password: 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
    property:
      prefix: ENC(
      suffix: )
    iv-generator-classname: org.jasypt.iv.RandomIvGenerator

把上方的依赖引入之后,我们就可以使用jasypt去进行加密了。我在这里介绍两种方式。

1.通过测试获取加密后的数据

    @Resource
    StringEncryptor stringEncryptor;
    @Test
    void contextLoads() {
        String url = stringEncryptor.encrypt("jdbc:mysql://localhost:3306/test");
        String username = stringEncryptor.encrypt("root");
        String password = stringEncryptor.encrypt("2020");
        System.out.println("url="+url);
        System.out.println("username="+username);
        System.out.println("password="+password);
    }

SpringBoot整合jasypt实现重要数据加密

加密后的数据我们已经能够看到了,我现在把这些数据替换到我的application配置文件中。

spring:
  datasource:
    url: ENC(avXTcfv9THzOKeuZ0uo38uc+5+K1W/8YHL2Iarf0R308uIsr2x3rRwXWmEDUQvxIFn25IQjCpzHQaZ9+pwg0qOcBi+NaiF1AAVi8W9actPo=)
    driver-class-name: com.mysql.jdbc.Driver
    username: ENC(1u9zbtQFYbb6EiNNQrl1bfGiQ2LfuhDsQ8RPFbZSBTsetSbVmJi4jRDbTKwE8NQv)
    password: ENC(eG38KvuezyPxMq1kcX/eZuXZZbWKYdSY0ITlZdXCh0CXnnfH5ktdwAqiqOSmaeqB)

现在调用python刚才测试mapper接口的方法看看结果。

SpringBoot整合jasypt实现重要数据加密

还是正确的,如果你不相信,可以调用下边的代码来看看,你的加密数据解密后是不是你真正的数据。方法内的参数需要你自己填写,就是你刚才生成的那些加密的数据。我就不在这里演示了。

        String url = stringEncryptor.decrypt("...");
        String username = stringEncryptor.decrypt("...");
        String password = stringEncryptor.decrypt("...");
        System.out.println("url="+url);
        System.out.println("username="+username);
        System.out.println("password="+password);

2.通过build插件

上方给出的方法,虽然我们将数据加密了,但是作为核心的“盐粒”我们却暴露了出来,如果我们不想将“盐粒”暴露呢?那么在你的pom文件中添加下边的代码。

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>com.github.ulisesbocchio</groupId>
                <artifactId>jasypt-maven-plugin</artifactId>
                <version>3.0.3</version>
                <configuration>
                    <path>file:src/main/resources/application.yml</path>
                </configuration>
            </plugin>
        </plugins>
    </build>

修改配置文件。

spring:
  datasource:
    url: DEC(jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false)
    driver-class-name: com.mysql.jdbc.Driver
    username: DEC(root)
    password: DEC(2020)
jasypt:
  encryptor:
    algorithm: PBEWITHHMACSHA512ANDAES_256
    property:
      prefix: ENC(
      suffix: )
    iv-generator-classname: org.jasypt.iv.RandomIvGenerator

运行下方指令。后边的那一串就是你要是用的密钥,我是生成出来的。

mvn jasypt:encrypt -Djasypt.encryptor.password=8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92

之后再次点击你的配置文件查看。原始的数据已经被加密了,并且这个加密的“盐粒”只有你知道。

SpringBoot整合jasypt实现重要数据加密

 那么接下来在调用mapper测试接口试试?这里会报红,因为你的配置文件是加密过的,你怎么可能直接去使用一个加密过的数据呢?你必须要先解密,但是你并没有在配置文件当中提供这个“盐粒”,所以你要通过其他的方式把这个“盐粒”添加进去。

SpringBoot整合jasypt实现重要数据加密

 为了方便展示,我在这里创建一个controller,调用的是studentServiceImpl,之后在调用studentMapper。因为项目要打包,所以只能这样展示,通过前端来展示数据。

引入web依赖。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

在StudentController中添加方法。

@RestController
@RequestMapping("/student")
public class StudentController {
    @Resource
    private StudentService studentService;
 
    @RequestMapping("/find-student")
    public String findStudent(){
        return  studentService.list().toString();
    }
}

把项目打包。

SpringBoot整合jasypt实现重要数据加密

之后在target目录下找到我们打包好的项目,打开cmd窗口运行下方指令。(盐粒要改成你自己的)

java -jar 你自己起的包名.jar --jasypt.encryptor.password=8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 

 访问网址查看,数据正确,解密成功。

SpringBoot整合jasypt实现重要数据加密

到此这篇关于SpringBoot整合jasypt实现重要数据加密的文章就介绍到这了,更多相关SpringBoot jasypt加密数据内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于SpringBoot整合jasypt实现重要数据加密的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153902

相关文章

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

Java方法重载与重写之同名方法的双面魔法(最新整理)

《Java方法重载与重写之同名方法的双面魔法(最新整理)》文章介绍了Java中的方法重载Overloading和方法重写Overriding的区别联系,方法重载是指在同一个类中,允许存在多个方法名相同... 目录Java方法重载与重写:同名方法的双面魔法方法重载(Overloading):同门师兄弟的不同绝

Spring配置扩展之JavaConfig的使用小结

《Spring配置扩展之JavaConfig的使用小结》JavaConfig是Spring框架中基于纯Java代码的配置方式,用于替代传统的XML配置,通过注解(如@Bean)定义Spring容器的组... 目录JavaConfig 的概念什么是JavaConfig?为什么使用 JavaConfig?Jav

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Java中ArrayList与顺序表示例详解

《Java中ArrayList与顺序表示例详解》顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构,:本文主要介绍Java中ArrayList与... 目录前言一、Java集合框架核心接口与分类ArrayList二、顺序表数据结构中的顺序表三、常用代码手动

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

Python实现快速扫描目标主机的开放端口和服务

《Python实现快速扫描目标主机的开放端口和服务》这篇文章主要为大家详细介绍了如何使用Python编写一个功能强大的端口扫描器脚本,实现快速扫描目标主机的开放端口和服务,感兴趣的小伙伴可以了解下... 目录功能介绍场景应用1. 网络安全审计2. 系统管理维护3. 网络故障排查4. 合规性检查报错处理1.

MySQL快速复制一张表的四种核心方法(包括表结构和数据)

《MySQL快速复制一张表的四种核心方法(包括表结构和数据)》本文详细介绍了四种复制MySQL表(结构+数据)的方法,并对每种方法进行了对比分析,适用于不同场景和数据量的复制需求,特别是针对超大表(1... 目录一、mysql 复制表(结构+数据)的 4 种核心方法(面试结构化回答)方法 1:CREATE