美文网首页
用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