⚔️ 项目配置信息存放在哪?
在日常开发工作中,我们经常需要使用到各种敏感配置,如数据库密码、各厂商的 SecretId、SecretKey 等敏感信息。
通常情况下,我们会将这些敏感信息明文放到配置文件中,或者放到配置中心中。
然而,这种做法存在严重的安全隐患!
🔞 安全措施有哪些?
- 使用环境变量替代明文配置信息
使用环境变量来替代配置文件中的明文敏感信息。在部署应用程序时,可以通过设置环境变量来传递敏感信息。 - 加密配置文件
使用对称加密或非对称加密来加密配置文件,以保护敏感信息。在加密配置文件时,必须指定加密算法和密钥,以及解密时使用的密钥。 - 禁止将配置文件提交到代码仓库!
为了防止配置文件泄露,应该禁止将配置文件提交到代码仓库中。可以将配置文件添加到 Gitignore 文件中,防止将其提交到代码仓库中。 - 使用安全的存储方式
如果将敏感信息存储在配置文件中,应该确保使用安全的存储方式。可以将配置文件存储在受保护的目录中,并限制访问该目录的权限。 - 限制访问配置文件的权限!
限制可以访问配置文件的用户和进程的权限,以防止未经授权的用户和进程访问配置文件。 - 审计配置文件的访问记录!
定期审计配置文件的访问记录,以检测是否存在未经授权的访问。
🎯目标:
学会用Jasypt 库来加密配置文件!
文章目录
- [⚔️ 项目配置信息存放在哪?](#⚔️ 项目配置信息存放在哪?)
- [🔞 安全措施有哪些?](#🔞 安全措施有哪些?)
- 🎯目标:
- 学习步骤:
- [一、了解 Jasypt](#一、了解 Jasypt)
-
- [Jasypt(Java Simplified Encryption)库](#Jasypt(Java Simplified Encryption)库)
- [二、引入 Jasypt 依赖](#二、引入 Jasypt 依赖)
-
- [建一个SpringBoot demo,引入 Jasypt 依赖(注意:这里只标 Jasypt 依赖,没说不用其他的依赖哈)](#建一个SpringBoot demo,引入 Jasypt 依赖(注意:这里只标 Jasypt 依赖,没说不用其他的依赖哈))
- [三、实现加解密工具类 JasyptUtil](#三、实现加解密工具类 JasyptUtil)
- 四、进行一波单元测试
-
- [拿 "CSNZ" 这个字符串加密](#拿 "CSNZ" 这个字符串加密)
- [拿 "OJsBWVePwbelr5XKuWXhYw==" 这个字符串解密](#拿 "OJsBWVePwbelr5XKuWXhYw==" 这个字符串解密)
- 五、敏感配置进行加密处理
- 六、项目,启动!
学习步骤:
1、了解 Jasypt
2、引入 Jasypt 依赖
3、实现加解密工具类 JasyptUtil
4、先进行一波单元测试
5、敏感配置进行加密处理
6、项目,启动!
一、了解 Jasypt
Jasypt(Java Simplified Encryption)库
Jasypt 是一个开源的 Java 加密库,可以为应用程序提供加密和解密功能
二、引入 Jasypt 依赖
建一个SpringBoot demo,引入 Jasypt 依赖(注意:这里只标 Jasypt 依赖,没说不用其他的依赖哈)
xml
<properties>
<jasypt-spring-boot-starter.version>3.0.4</jasypt-spring-boot-starter.version>
</properties>
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>${jasypt-spring-boot-starter.version}</version>
</dependency>
三、实现加解密工具类 JasyptUtil
java
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.jasypt.properties.PropertyValueEncryptionUtils;
import org.jasypt.util.text.BasicTextEncryptor;
import org.springframework.beans.factory.annotation.Value;
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class JasyptUtil {
/**
* 加密时的密钥
*/
private static String PRIVATE_KEY = "Evw3vbDt";
private static final String PREFIX = "ENC(";
private static final String SUFFIX = ")";
private static BasicTextEncryptor basicTextEncryptor = new BasicTextEncryptor();
static {
basicTextEncryptor.setPassword(PRIVATE_KEY);
}
/**
* 明文加密
*/
public static String encrypt(String plaintext) {
return basicTextEncryptor.encrypt(plaintext);
}
/**
* 解密
*/
public static String decrypt(String ciphertext) {
ciphertext = PREFIX + ciphertext + SUFFIX;
if (PropertyValueEncryptionUtils.isEncryptedValue(ciphertext)) {
String plaintext = PropertyValueEncryptionUtils.decrypt(ciphertext, basicTextEncryptor);
return plaintext;
}
return "";
}
}
四、进行一波单元测试
拿 "CSNZ" 这个字符串加密
java
@Test
public void testEncrypt() {
String encrypt = JasyptUtil.encrypt("CSNZ");
System.out.println(encrypt);
}
得到的结果是:OJsBWVePwbelr5XKuWXhYw==
拿 "OJsBWVePwbelr5XKuWXhYw==" 这个字符串解密
java
@Test
public void testDecrypt() {
String decrypt = JasyptUtil.decrypt("OJsBWVePwbelr5XKuWXhYw==");
System.out.println(decrypt);
}
得到的结果是:
五、敏感配置进行加密处理
修改加密工具库,密钥使用参数传入
java
@Value("${jasypt.passKey}")
private static String PRIVATE_KEY;
配置文件信息配置
yml
server:
port: 8080
encrypt:
test:
# 此处是密码的密文(文中示例的就是CSNZ的密文),要用 ENC() 进行包裹
name: ENC(OJsBWVePwbelr5XKuWXhYw==)
# 加密配置
jasypt:
encryptor:
# 指定加密密钥,生产环境需要放到启动参数
password: ${jasypt.passKey}
# 指定解密算法,需要和加密时使用的算法一致
algorithm: PBEWithMD5AndDES
# 指定 initialization vector 类型
iv-generator-classname: org.jasypt.iv.NoIvGenerator
启动类,读取配置文件信息并打印
java
@SpringBootApplication
public class Application implements InitializingBean {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Value("${encrypt.test.name}")
private String name;
@Override
public void afterPropertiesSet() throws Exception {
System.err.println("程序启动...");
System.out.println(name);
}
}