【SpringBoot】SpringBoot整合jasypt进行重要数据加密

2024-06-04 7949阅读

【SpringBoot】SpringBoot整合jasypt进行重要数据加密 第1张

  📝个人主页:哈__

期待您的关注 

【SpringBoot】SpringBoot整合jasypt进行重要数据加密 第2张

目录

 

📕jasypt简介 

 🔥SpringBoot使用jasypt

📂创建我需要的数据库文件

 📕引入依赖

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

🌙创建mapper接口

🔒配置文件加密 

一、通过测试获取加密后的数据

 二、通过build插件


 

📕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;

     📕引入依赖

            
                org.springframework.boot
                spring-boot-starter
            
            
                org.springframework.boot
                spring-boot-starter-test
                test
            
            
                mysql
                mysql-connector-java
                5.1.5
            
            
            
                com.github.ulisesbocchio
                jasypt-spring-boot-starter
                3.0.3
            
           
            
                org.projectlombok
                lombok
            
            
            
                com.baomidou
                mybatis-plus-boot-starter
                3.5.2
            

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

    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,如果不会使用,可以看我另一篇文章【Spring】SpringBoot整合MybatisPlus的基本应用_简单的springboot+mybatisplus的应用程序-CSDN博客

    @Mapper
    public interface StudentMapper extends BaseMapper {
    }

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

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

    【SpringBoot】SpringBoot整合jasypt进行重要数据加密 第3张


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

    🔒配置文件加密 

    引入依赖

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

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

    一、通过测试获取加密后的数据

        @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】SpringBoot整合jasypt进行重要数据加密 第4张

    加密后的数据我们已经能够看到了,我现在把这些数据替换到我的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)

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

    【SpringBoot】SpringBoot整合jasypt进行重要数据加密 第5张

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

            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);

     二、通过build插件

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


        
            
                
                    org.springframework.boot
                    spring-boot-maven-plugin
                
                
                    com.github.ulisesbocchio
                    jasypt-maven-plugin
                    3.0.3
                    
                        file:src/main/resources/application.yml
                    
                
            
        

    修改配置文件。

     
    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】SpringBoot整合jasypt进行重要数据加密 第6张


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

    【SpringBoot】SpringBoot整合jasypt进行重要数据加密 第7张


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

    引入web依赖。

            
                org.springframework.boot
                spring-boot-starter-web
            

    在StudentController中添加方法。

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

    把项目打包。

    【SpringBoot】SpringBoot整合jasypt进行重要数据加密 第8张


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

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

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

    【SpringBoot】SpringBoot整合jasypt进行重要数据加密 第9张

     

     

     


    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]