美文网首页
用jasypt对配置文件中敏感的配置项进行加密

用jasypt对配置文件中敏感的配置项进行加密

作者: 砒霜拌辣椒 | 来源:发表于2020-08-31 17:36 被阅读0次

之前看过一个例子,一个酒店管理公司的后台程序员把自家项目上传到了github,导致在配置文件中的数据库密码外泄。因此后果可想而知了...

我们在平时开发中,习惯把一些敏感的配置项以明文方式直接写在配置文件中。这样很容易导致密码泄露。

spring:
  redis:
    cluster:
      nodes:
        - 148.70.153.63:9426
        - 148.70.153.63:9427
        - 148.70.153.63:9428
        - 148.70.153.63:9429
        - 148.70.153.63:9430
        - 148.70.153.63:9431
    password: 123456

我之前的一些博客分享的源码中,配置文件中的敏感数据我都是在yml中随便写一个,然后把正确的参数填到启动参数中去覆盖jar包内的配置。如果配置项较多,也是比较麻烦的。

我们可以使用一个叫做jasypt的加密组件来解决上述的问题。

1、Maven依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.4.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>com.github.ulisesbocchio</groupId>
        <artifactId>jasypt-spring-boot-starter</artifactId>
        <version>3.0.3</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
</dependencies>

2、应用示例

2.1、配置加密密钥

jasypt:
  encryptor:
    password: chili

可以理解为jasypt会使用这个自定义加密密钥,对配置文件里的重要项进行加密。

2.2、加密敏感数据获取密文

@RunWith(SpringRunner.class)
@SpringBootTest
public class JasyptApplicationTests {
    @Autowired
    private StringEncryptor encryptor;

    @Test
    public void testEncrypt() {
        System.out.println(encryptor.encrypt("123456")); // LEvdXWT9sxdAQS3bcoJ4fIzaAbF+/43Oo/sm8ohv5CIg5NhW0C1gyEl/yYCAfCXA
    }
}

这里写个临时的Test方法把加密后的密文输出来就行。每次测试密文都会不一样但解密后的明文都是一样的。

2.3、配置密文数据

spring:
  redis:
    cluster:
      nodes:
        - 148.70.153.63:9426
        - 148.70.153.63:9427
        - 148.70.153.63:9428
        - 148.70.153.63:9429
        - 148.70.153.63:9430
        - 148.70.153.63:9431
    password: ENC(LEvdXWT9sxdAQS3bcoJ4fIzaAbF+/43Oo/sm8ohv5CIg5NhW0C1gyEl/yYCAfCXA)

密文需要用ENC()包装。如果想指定别的自定义标记,可以如下配置:

jasypt:
  encryptor:
    password: chili
    property:
      prefix: PASSWORD(
      suffix: )

这样就可以用PASSWORD()来包装密文了,默认使用ENC()包装。

在项目启动时,就会先把密文解密,最后再以明文方式注入配置属性中。

2.4、问题改进

上面的方式有一个很大的问题就是jasypt.encryptor.password密钥直接写在了配置文件中,知道密钥只需要将密文还原就可以得到明文,依旧会有密码泄露的风险。

解决:
我们可以把jasypt.encryptor.password这项配置写在启动脚本中,配置成启动参数的方式,而不是写在工程的配置文件中。

java -jar yourproject.jar --jasypt.encryptor.password=privateKey
# 或者
java -Djasypt.encryptor.password=privateKey -jar yourproject.jar

甚至还可以作为系统环境变量来带入。

参考链接

代码地址

相关文章

网友评论

      本文标题:用jasypt对配置文件中敏感的配置项进行加密

      本文链接:https://www.haomeiwen.com/subject/ehhpsktx.html