配置文件加密
前言
很多公司愿意将代码数据提交至 Git、Gitee 等代码托管的系统中,但是不免配置文件中一些核心数据也会被提交上去。
例如:数据库 ip 地址、账号、密码;Redis ip 地址、账号、密码等。
一旦这些数据提交到开放式 Git 上,不免会有其他人拉取代码,并且通过账号密码登录至服务器进行操作。
所以为了应对这样的情况,我们来介绍一下一种技术: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应用中,无需手动配置复杂的加密相关的代码和配置文件。
使用
- 先去弄个 springboot 的项目,方便我们学习。
pom
首先在 pom 中引入 jasypt-spring-boot-starter
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
添加配置
jasypt:
encryptor:
password: chen2024
这里的 password 指的是盐,可以自己拟定,我这里使用 chen2024
。
生成密文
我们在测试类中,引入 StringEncryptor
,然后通过调用 encrypt()
、decrypt()
来进行创建密文和解密密文。
@Autowired
private StringEncryptor stringEncryptor;
@Test
void contextLoads() throws IOException {
String str = "123456";
String secretStr = stringEncryptor.encrypt(str);
String restoreSrt = stringEncryptor.decrypt(secretStr);
System.out.println(secretStr);
System.out.println(restoreSrt);
}
第一次输出:
4DuRhP6aZh4gs3CJ8QVq6tiw5AyLNwMy8qnt+qn4qMnnoTwkl+UOMUsKAHaAlsYY
123456
第二次输出:
/pSenuO+zuOtJaYt+dBMzmCnEugCb/8su04piPS9EJ6FfsI7igA9bqhuLO1JlgQ7
123456
结果分析:可以看到,虽然我们是同样的盐,同样的原文,但是最后输出的密文是两种。
替换配置
接着我们将生成的密文,直接替换我们之前的配置文件。
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:mysql://localhost:3306/kingpassword-individual?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf-8&autoReconnect=true
username: root
password: ENC(3na+lCZEsXUbi0XSWKxq4CMo9MCfklQOE9ZrfychqRztbLG5VIbJ8/vGHgh9cMs8)
driver-class-name: com.mysql.cj.jdbc.Driver
这里我们需要在要配置的地方使用 ENC()
将密文括起来,然后我们启动一下项目试试看。
更换 ENC 名称
我们这里也可以不使用 ENC 这个名称,我们也可以通过修改配置文件自定义这个配置。
jasypt:
property:
prefix: Sugar(
suffix: )Code
prefix 为前缀,suffix 为后缀,然后我们修改一下我们之前的配置文件。
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:mysql://localhost:3306/kingpassword-individual?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf-8&autoReconnect=true
username: root
password: Sugar(3na+lCZEsXUbi0XSWKxq4CMo9MCfklQOE9ZrfychqRztbLG5VIbJ8/vGHgh9cMs8)Code
driver-class-name: com.mysql.cj.jdbc.Driver
重启一下服务,可以发现一样是可以使用的。
部署
如果我们将上述代码进行提交的时候,切记,不要提交我们的盐,因为有了盐,通过调用 decrypt()
就可以知道你的原文了。 所以在部署的时候,我们需要在启动命令中增加参数。
java -jar xxx.jar --jasypt.encryptor.password=chen2024 &