场景描述

比如yaml配置文件中数据库连接,或者其他的关键配置项,用明文直接写,一旦配置文件代码被外泄了,那就存在很大的风险。

为了安全期间,使用Jasypt对配置文件的值进行加密和解密操作,保证配置参数的安全性。

实战操作

1.pom.xml引入依赖

            <dependency>
                <groupId>com.github.ulisesbocchio</groupId>
                <artifactId>jasypt-spring-boot-starter</artifactId>
                <version>3.0.5</version>
            </dependency>

2.生成加密字符串

加密的方法,需要自己写个测试类来生成一下,下面是已经写好的测试方法:

DemoApplicationTests.java

import org.jasypt.encryption.StringEncryptor;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * 明文密码加密工具
 */
@SpringBootTest
class DemoApplicationTests {

    @Autowired
    private StringEncryptor encryptor;

    /**
     * 加密
     * 1.再使用前应该先将sa-base/src/main/resources/dev/sa-base.yaml文件中下方的配置文件放开,
     * (注:不用时将这几个参数注释掉,为了安全性我们的jasypt使用JVM参数的方式进行传递jasypt密码)
     * #jasypt:
     * #  encryptor:
     * #    password: 加密强密码
     * 2.将value的值替换为需要加密的值
     * 3.执行单元测试
     * 4.获取到加密字符串后,将原本的明文密码替换为:ENC(加密字符串)
     */
    @Test
    void encrypt() {
        //替换成自己需要加密的字符
        String value = "明文字符串";
        System.out.println(encryptor.encrypt(value));
    }

    /**
     * 解密
     */
    @Test
    void decrypt() {
        // 替换为需要解密的密文(不需要包含 ENC() 包裹)
        String cipherText = "密文字符串";
        try {
            String plain = encryptor.decrypt(cipherText);
            System.out.println(plain);
        } catch (Exception e) {
            System.err.println("解密失败,请确认 Jasypt 口令与算法一致:" + e.getMessage());
            throw e;
        }
    }

}

还需要在当前运行的环境(dev)的配置文件中添加一段配置,用于定义加密的密钥,配置如下:

# yaml配置文件加密/解密的密钥
jasypt:
  encryptor:
    password: 123456

这段配置放到开发环境的配置文件中,因为是在开发环境中,先把明文的内容,调用测试类来生成密文的内容。最后放到生产环境的配置文件中。

上面配置和Java测试类创建好之后,启动项目,调用加密的测试方法:

控制台会输出加密后的密文。

3.在生产配置文件中放入密文

把密文放到生产配置文件中,如下图:

注意:密文字符串,需要用ENC()包起来,代表这是用Jasypt算法进行加密后的内容。

4.版本发布

在版本发布时,需要配置参数,让spring boot自动识别到密文对应的明文,只有这样,系统才能正常运行。

如果是用java -jar 命令启动应用的情况,使用java -jar启动时直接在最后添加

-Djasypt.encryptor.password=你的口令

例如:java -jar myapp.jar -Djasypt.encryptor.password=123456

如果是linux的服务方式(systemd)启动应用,那么服务的配置文件中,添加配置:

Environment="JASYPT_ENCRYPTOR_PASSWORD=密钥"

配置完成后,启动项目,自动就会对加密字符串进行解密,识别到真实的配置参数。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐