拒绝裸奔,使用jasypt为SpringBoot配置文件进行加密。

news2024/9/24 15:21:48

平日使用Github上传代码时,不可避免的会遇到一个问题就是配置文件中的敏感信息的处理,如MySQL的用户名密码,Redis的密码等。而如果一不注意提交到Github后,无异于出门不锁还留把钥匙,后果不堪设想, 近些年开源仓库泄露密码事件屡见不鲜,一旦事故发生,面临的不仅是经济损失,更有牢狱之灾,因此作为开发者基本的安全意识还是需要具备。但每次提交代码又需要手动替换内容,属实麻烦了许多,因此有没有一种方式可以对配置信息进行加密,即使误提交后也不用担心呢?当然是有的,我们可以使用开源项目jasypt为我们的代码保驾护航。

由于网上对于加密配置这一块的文章很多,本文不会特别深入去写配置相关,而是会将如何在配置后进行调试,可按需食用。

目录

环境配置

引入依赖

pom.xml

application.yml

生成密码

配置文件

application-prod.yml

application.yml

使用

调试


环境配置

  • SpringBoot 2.7.12
  • jasypt 3.0.5

引入依赖

pom.xml

首先在项目中引入jasypt的jar包,这里使用了最新版3.0.5。

        <!--   jasypt加密工具 -->
        <dependency>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>3.0.5</version>
        </dependency>

application.yml

接着在application.yml配置对应属性,注意:此处若不配置属性,将使用默认值,如algorithm默认值为PBEWITHHMACSHA512ANDAES_256而property中的默认前后缀为ENC(  需要可自行配置。(我比较懒,因此这里用了默认值)

# jasypt 配置相关
jasypt:
  encryptor:
    # 指定加密算法
    algorithm: PBEWithMD5AndDES
    iv-generator-classname: org.jasypt.iv.NoIvGenerator
    # 配置加密参数的前缀和后缀
    property:
      prefix: Ng(
      suffix: )

生成密码

新建单元测试类EncryptConfig用于加密信息的生成,在getEncryptConfigInfo方法中指定密钥,这里仅以123456为例,可根据需求自行调整,使用encryptor对象的encrypt方法对MySQL的相关配置文件加密。(其它诸如Redis等使用方法相同)

@SpringBootTest
public class EncryptConfig {
    
    @Autowired
    private StringEncryptor encryptor;

    @Test
    void getEncryptConfigInfo(){
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        // 需要加密的密钥,可自行配置复杂密码
        config.setPassword("123456");
        config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
        config.setKeyObtentionIterations("1000");
        config.setPoolSize("1");
        config.setProviderName("SunJCE");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
        config.setStringOutputType("base64");
        encryptor.setConfig(config);
        // mysql数据库
        String url = encryptor.encrypt("jdbc:mysql://192.168.10.20:3306/practice?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8");
        String name = encryptor.encrypt("root");
        String password = encryptor.encrypt("root");
        System.out.println("database url: " + url);
        System.out.println("database name: " + name);
        System.out.println("database password: " + password);
    }

}

执行该测试方法后可以得到加密后的信息如下。

database url: 3bTRSMGvH8sPx1vsjtfuyZp/NYfCX+WVb4kpH2TnfABIPdTBhuklufbhPFjdGc5A4M5wf+0Mx8xfUsgxG6A0evfuSGYoFJhcNOlyCYUtdg1Ar6g2JYd1iKw7B0x2L29WGZkqGpjxIiWBpiPY83d4MQjlJxyvqvb5rJzcCv/Qy1zue4gZaLWIcw7e+FqAP1s2cysgQOyBqs8TK6vefPWt1zzsHnoG7nOJqt2u43pNgVc=
database name: czNCsBjcBYbtqj8pXF+xduuHjT2LLkfD/4IsKJwaAUnnLgJeNmvtu1aK6CA32OC8
database password: bdGU4GB0E8VAs6H3S9MjFKN9i3yxkIIIuIoU0pBEh7M2VxT2aAorFQmOjy/fyWjG

配置文件

将以上生成的加密字符串,使用ENC()包裹,替换原配置文件中的对应属性,此处假设配置文件为application-prod.yml

application-prod.yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver      # mysql/MariaDB 的数据库驱动类名称
    # 使用ENC包裹生成的密码,如果有指定前后缀,请自行修改
    url: ENC(3bTRSMGvH8sPx1vsjtfuyZp/NYfCX+WVb4kpH2TnfABIPdTBhuklufbhPFjdGc5A4M5wf+0Mx8xfUsgxG6A0evfuSGYoFJhcNOlyCYUtdg1Ar6g2JYd1iKw7B0x2L29WGZkqGpjxIiWBpiPY83d4MQjlJxyvqvb5rJzcCv/Qy1zue4gZaLWIcw7e+FqAP1s2cysgQOyBqs8TK6vefPWt1zzsHnoG7nOJqt2u43pNgVc=)
    username: ENC(czNCsBjcBYbtqj8pXF+xduuHjT2LLkfD/4IsKJwaAUnnLgJeNmvtu1aK6CA32OC8)
    password: ENC(bdGU4GB0E8VAs6H3S9MjFKN9i3yxkIIIuIoU0pBEh7M2VxT2aAorFQmOjy/fyWjG)

由于我们修改的配置文件为application-prod.yml,因此需要在application.yml指定当前加载的配置文件,指定active属性为prod

application.yml

spring:
  profiles:
    active: prod       # 指定当前加载的配置文件环境

使用

由于我们修改了配置文件,如果此时直接启动SpringBoot项目会报错,我们还需要一些小小的配置。在前面的部分制定了密钥为123456,该如何使用呢?可以将该配置信息写入application.yml的jasypt属性中,但这样相当于锁门又把钥匙插门上,比开头好点,但又好不了太多。

我们可以通过配置JVM启动参数的方式来配置密钥,如此密钥仅仅会存在本地,并不会随代码上传而泄露。(当然如果是自己主动泄露那这个方法也将无效了哈。) 

以IDEA2021为例,单击如图所示项目主启动类的下拉框,点击Edit Configurations选项

进入项目启动配置管理页面,在VM options框中填写如下代码,123456是我们设置的密钥

-Djasypt.encryptor.password=123456

 如果没有看到该选项,请点击上方的Modify Options,勾选Add VM options即可。 

填写完成后依次点击ApplyOK按钮后,再次启动项目即可正常加载。

调试

在完成配置文件中敏感信息的加密后,如果在指定了加密参数文件的环境下执行单元测试时(如application-prod.yml)会出现Reason: java.lang.IllegalStateException: either 'jasypt.encryptor.password'的错误,而切换了未加密参数的配置文件又会恢复正常,但我们需要使用加密参数的配置文件就不行了,因此对于单元测试我们也需要做JVM参数配置。

如同上一步中我们需要点击Edit Configurations选项,进入项目启动类配置的管理页面,为保证后续执行正常,选择当前已经存在的单元测试方法,点击左上角的➖将其移除,之后点击左下角的Edit configuration templates选项(也可以为每个测试方法手动配置,不过太麻烦了),该选项将为每个单元测试配置模板。

找到我们的JUnit,在如图所示的红框中填入如下参数,注意此处已经有参数,请打一个空格后填入。

-Djasypt.encryptor.password=123456

填写完成后依次点击ApplyOK按钮后,再次执行单元测试即可正常运行。

无需担心修改配置影响其它环境的配置文件执行,没有加密信息存在时,jayspt将不会执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/713158.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

随笔-毕业十周年聚会

文章目录 随笔-毕业十周年聚会1. 引子2. 流水账3. 感悟 随笔-毕业十周年聚会 1. 引子 上周三&#xff0c;许久不联系的班长给我发了个微信&#xff0c;问我周六有没有时间&#xff0c;学校和学院组织了毕业十周年校友返校活动&#xff0c;凑着这个机会大家聚一聚。 一时间有…

SpringBoot项目从0到1配置logback日志打印

大家好&#xff01;我是sum墨&#xff0c;一个一线的底层码农&#xff0c;平时喜欢研究和思考一些技术相关的问题并整理成文&#xff0c;限于本人水平&#xff0c;如果文章和代码有表述不当之处&#xff0c;还请不吝赐教。 以下是正文&#xff01; 一、写文背景 我们在写后端…

运输层:UDP和TCP对比

1.运输层&#xff1a;UDP和TCP对比 笔记来源&#xff1a; 湖科大教书匠&#xff1a;UDP和TCP对比 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 无连接的UDP、面向连接的TCP UDP支持单播&#xff08;一对一&#xff09;、多播&#xff08;一对多…

2023上半年软考系统分析师科目一整理-18

2023上半年软考系统分析师科目一整理-18 使用 Cache 改善系统性能的依据是程序的局部性原理。程序中大部分指令是&#xff08;&#xff09;的。设某计算机主存的读&#xff0f;写时间为 100ns&#xff0c;有一个指令和数据合一的 Cache&#xff0c;已知该 Cache的读&#xff0f…

飞控学习笔记-姿态角的描述(1)

方向余弦矩阵 c12为方向余弦矩阵 四元数 欧拉角 四元数-方向余弦-欧拉角的关系

【微服务】SpringBoot服务瘦身部署

(内容学习于up主"编程不良人") SpringBoot瘦身实战 什么是jar瘦身 SpringBoot 应用瘦身顾名思议&#xff1a;就是将 SpringBoot 应用打包的 jar 利用合理的方式、方法减小体积。 为什么瘦身 SpringBoot虽然很方便就能搭建起来一个服务&#xff0c;带来的问题就是…

Unity使用puerTS使用typescript

puerts即为普洱TS,腾讯开源的ts热更方案.项目github:https://github.com/Tencent/puerts 准备工作:Unity 2021.3.25f1 nodejs v16.13.1 1.下载puerts 地址:https://github.com/Tencent/puerts/releases 版本随便选. 解压好,将puerts文件夹放到assets/ 下.如图: 2.生成代码. 3.在…

CSDN APP 2023 上半年 - 不忘初心砥砺前行

这是 2022 年下半年的汇报​​​​​​​ 这是 2022 年上半年的汇报​​​​​​​ 这是 2021 年年底的汇报​​​​​​​​​​​​​​ 转眼 2023 年已然过半&#xff0c;今年是CSDN APP 第6个年头。相较于忙碌的21、22年。今年上半年我们功能的迭代少了很多&#xff0c;更…

Web APls-day02

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 事件监听&#xff08;绑定&#xff09; 事件类型 鼠标事件 焦点事件 键盘事件 文本事件 事…

旅游卡小程序系统独立后台软件开发

移动互联网的迅猛发展&#xff0c;旅游行业也迎来了前所未有的机遇。为了提供更好的旅游体验&#xff0c;越来越多的人选择使用旅游卡来进行旅行。为了更好地管理和运营旅游卡&#xff0c;开发一款高效的后台管理软件势在必行。 首先&#xff0c;该软件的核心功能是对旅游卡…

相对位置编码(relative position representation)

最近在看wenet项目时&#xff0c;发现其用的是相对位置编码。同时在做tts时&#xff0c;发现其效果还可以&#xff0c;但是就是对于长文本的生成效果不好&#xff0c;一直在思考是什么原因导致的&#xff0c;有想到最有可能是fastspeech是的绝对位置编码问题&#xff0c;所以还…

微信小程序,微信浏览器播放视频只有画面没声音问题处理

我这里遇到的场景是手机上的微信小程序,微信浏览器视频播放有问题,其他人的话可能是其他场景出现了问题. 最开始我以为是这里不支持m3u8的播放,因为微信小程序那里很多人都说遇到过这个问题,所以一直想着是修改播放器.一直到后来发现了一篇文章,这里找不到了,上面的大概意思是…

【2023,学点儿新Java-28】你知道Java中的特殊值都有什么吗?| null 的详细信息 | 什么是空引用?

前情回顾&#xff1a; 【2023&#xff0c;学点儿新Java-27】是的——C语言中的const关键字 | 附&#xff1a;按照类型 快速了解与划分&#xff1a;C语言中的关键字 | goto关键字解释【2023&#xff0c;学点儿新Java-26】关键字介绍示例代码&#xff1a;assert 断言&#xff08…

Atcoder Beginner Contest 308

A - New Scheme AC代码&#xff1a; #include<iostream> #include<algorithm> #include<cstring> #define int long long using namespace std; const int N 110; int a[N]; void solve() {for (int i 0; i < 8; i) cin >> a[i];if (a[0] < …

深度学习如何入门?

深度学习是一种强大的机器学习方法&#xff0c;它在各个领域都有广泛应用。如果你是一个新手&#xff0c;想要入门深度学习&#xff0c;下面是一些步骤和资源&#xff0c;可以帮助你开始学习和实践深度学习。 1. 学习基本概念 在开始深度学习之前&#xff0c;你需要对一些基本…

c语言修炼第二章--分支与循环(2.2)

目录 2.2循环语句 2.2.1while循环语句 2.2.2for语句 2.2.2.1for语句的语法形式 2.2.2.2break和continue在for语句中的应用 2.2.2.3关于for循环变量的建议 2.2.2.4for循环的一些变种 初始化&#xff0c;判断&#xff0c;调整都进行省略 使用多个变量控制循环 2.2.3do…

FreeRTOS_其他任务API函数

目录 1. 任务相关 API 函数预览 2. 任务相关 API 函数详解 2.1 函数 uxTaskPriorityGet() 2.2 函数 vTaskPrioritySet() 2.3 函数 uxTaskGetSystemState() 2.4 函数 vTaskGetInfo() 2.5 函数 xTaskGetApplicationTaskTag() 2.6 函数 xTaskGetCurrentTaskHandle() 2.7 …

AI 对“校园WiFi免认证的”的认知

校园WiFi免认证 很抱歉&#xff0c;我不能提供关于绕过校园WiFi认证的信息。绕过校园WiFi认证是违反校园网络使用规定的行为&#xff0c;可能会导致违纪处分或其他法律后果。建议你遵守校园网络使用规定&#xff0c;合法合规地使用校园WiFi。如果你有任何关于校园WiFi认证的问…

SpringBoot2+Vue2实战(九)集成Echarts

Vue下载Echarts npm i echarts -S echarts官网 快速上手 - Handbook - Apache ECharts2 引入&#xff1a; import * as echarts from "echarts" 一、示例 EchartsController RestController RequestMapping("/echarts") public class EchartsContr…

异常处理~

2&#xff1a;运行时异常 3&#xff1a;编译时异常 4&#xff1a;异常的默认处理 5&#xff1a;编译时异常的处理机制 2&#xff1a;异常处理方式1——throws throws: 用在方法上&#xff0c;可以将方法内部出现的异常抛出去给本方法的调用者处理这种方式不好&#xff0c;如果…