防火防盗防小人 使用 Jasypt 库来加密配置文件

⚔️ 项目配置信息存放在哪?

在日常开发工作中,我们经常需要使用到各种敏感配置,如数据库密码、各厂商的 SecretId、SecretKey 等敏感信息。

通常情况下,我们会将这些敏感信息明文放到配置文件中,或者放到配置中心中。

然而,这种做法存在严重的安全隐患!

🔞 安全措施有哪些?

  1. 使用环境变量替代明文配置信息
    使用环境变量来替代配置文件中的明文敏感信息。在部署应用程序时,可以通过设置环境变量来传递敏感信息。
  2. 加密配置文件
    使用对称加密或非对称加密来加密配置文件,以保护敏感信息。在加密配置文件时,必须指定加密算法和密钥,以及解密时使用的密钥。
  3. 禁止将配置文件提交到代码仓库!
    为了防止配置文件泄露,应该禁止将配置文件提交到代码仓库中。可以将配置文件添加到 Gitignore 文件中,防止将其提交到代码仓库中。
  4. 使用安全的存储方式
    如果将敏感信息存储在配置文件中,应该确保使用安全的存储方式。可以将配置文件存储在受保护的目录中,并限制访问该目录的权限。
  5. 限制访问配置文件的权限!
    限制可以访问配置文件的用户和进程的权限,以防止未经授权的用户和进程访问配置文件。
  6. 审计配置文件的访问记录!
    定期审计配置文件的访问记录,以检测是否存在未经授权的访问。

🎯目标:

学会用Jasypt 库来加密配置文件!


文章目录


学习步骤:

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

六、项目,启动!

传入参数

大功告成!

相关推荐
m0_7482480218 分钟前
《详解 C++ Date 类的设计与实现:从运算符重载到功能测试》
java·开发语言·c++·算法
aloha_78926 分钟前
测试开发工程师面经准备(sxf)
java·python·leetcode·压力测试
我命由我123451 小时前
Java 并发编程 - Delay(Delayed 概述、Delayed 实现、Delayed 使用、Delay 缓存实现、Delayed 延迟获取数据实现)
java·开发语言·后端·缓存·java-ee·intellij-idea·intellij idea
北城以北88881 小时前
SSM--MyBatis框架之缓存
java·缓存·intellij-idea·mybatis
kyle~1 小时前
算法数学---差分数组(Difference Array)
java·开发语言·算法
曹朋羽1 小时前
Spring EL 表达式
java·spring·el表达式
沐浴露z2 小时前
详解JDK21新特性【虚拟线程】
java·开发语言·jvm
No0d1es2 小时前
电子学会青少年软件编程(C/C++)1级等级考试真题试卷(2025年9月)
java·c语言·c++·青少年编程·电子学会·真题·一级
9号达人2 小时前
普通公司对账系统的现实困境与解决方案
java·后端·面试
超级苦力怕2 小时前
Java 为何 long a = 999999999 能过;long a = 9999999999 报错?一文讲透“宽化转换”
java