目录

一、背景        

二、本地修复测试

1、maven中引入jasypt 

2、编写加密解密工具类

3、修改配置文件,增加秘钥

4、秘钥放在启动项

 三、生产实现

1、升级打包代码

2、生产yml修改明文密码处

3、修改启动命令


一、背景        

        最近接收到网安的系统安全漏洞通知,其中有一个Springboot项目存在配置文件中采用明文存储密码漏洞,如下代码,会导致所有能够访问该文件的人都能访问该密码,将会降低系统安全性。即使不能阻止应用程序被那些可以访问配置文件的攻击者入侵,也可以通过加密密码提升攻击者入侵难度,故配置文件中的密码应进行加密存储。于是需要修复。建议配置文件中采用jasypt加密的密码存储密码。于是就按照建议做下修复方案。

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: oracle.jdbc.OracleDriver
    username: objBat
    password: rootUdasd_110$$
    url: jdbc:oracle:thin:@//10.10.55.1110:1521/objPro

二、本地修复测试

1、maven中引入jasypt 

pom文件中加入以下配置即可,版本根据情况而定

<!--jasypt配置加密-->
		<dependency>
			<groupId>com.github.ulisesbocchio</groupId>
			<artifactId>jasypt-spring-boot-starter</artifactId>
			<version>2.1.2</version>
		</dependency>

2、编写加密解密工具类

既然要加密解密,那至少得有个测试工具才能知道加密,解密之后密码是否产生变化, 心里才有底。

package com.project.util;

import org.jasypt.encryption.StringEncryptor;
import org.jasypt.util.text.BasicTextEncryptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;

/**
 * Created by HJ on 2023/5/26 
 */
public class EscUtil {
    @Autowired
    private StringEncryptor stringEncryptor;

     public String encry(String str){
        String encData = stringEncryptor.encrypt(str);
        String decData = stringEncryptor.decrypt(encData);
        System.out.println("加密数据:"+encData);
        System.out.println("解密数据: " +decData);
        return encData;
    }

    public static void main(String[] args) {
        //创建加密对象,默认PBEWhisMD5AndDES
        BasicTextEncryptor encryptor = new BasicTextEncryptor();
        //加密秘钥
        encryptor.setPassword("BD9FA15C-7976-47DA-B8D5-E2438115F937");
        //将明文进行加密
        String encData = encryptor.encrypt("rootUdasd_110$$");
        //密文解密
        String decData = encryptor.decrypt(encData);
        System.out.println("数据加密后:"+encData);
        System.out.println("数据解密后: "+decData);
        String encDatar = encryptor.encrypt("redisUhsgf_52#");
        //密文解密
        String decDatar = encryptor.decrypt(encDatar);
        System.out.println("r加密后:"+encDatar);
        System.out.println("r解密后: "+decDatar);
    }

}

其中 encryptor.setPassword后边接的是秘钥,这就使用UUID作为秘钥加密,也就是下文的BD9FA15C-7976-47DA-B8D5-E2438115F937 然后将明文密码放进去进行加密,再输出解密后的密码,看是否一致,那如下结果,看起来是一致的

Springboot配置文件中的明文密码漏洞-LMLPHP

这个时候我们再运行一次,发现加密后的代码跟之前的不一样了,那有人可能担心了,那密码到底是按照哪个呢?答案就是,jasypt加密每次加密产生的密文都不一样,然后不一样的密文解密产生的结果是一样的,也就是说,随便写一个生成的密文都可以。

 Springboot配置文件中的明文密码漏洞-LMLPHP

3、修改配置文件,增加秘钥

在配置文件中增加秘钥配置 ,项目中使用的yml配置,那就这样加了,如果是properties配置,对应转化下就行

#jasypt加密秘钥
jasypt:
  encryptor:
    password: abcdef

修改明文密码的地方,将加密后的密文使用ENC加括号括起来即可

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: oracle.jdbc.OracleDriver
    username: objBat
    password: ENC(2C4G7sdQSEwHUEnZMxQOVNHkZxTQ4DoT)
    url: jdbc:oracle:thin:@//10.10.55.1110:1521/objPro

启动项目,可以正常连接,表示没问题

4、秘钥放在启动项

由于秘钥是放在yml配置文件中,其实就相当于告诉你,我加密了,加密的秘钥也在这里,颇有点掩耳盗铃的风范,于是为了安全起见,最好把秘钥放在启动项或者配置项里。启动项VM加上以下配置,

-Djasypt.encryptor.password=BD9FA15C-7976-47DA-B8D5-E2438115F937

Springboot配置文件中的明文密码漏洞-LMLPHP

 然后yml中删除jasypt加密秘钥,也就是这些

Springboot配置文件中的明文密码漏洞-LMLPHP

 三、生产实现

1、升级打包代码

2、生产yml修改明文密码处

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: oracle.jdbc.OracleDriver
    username: objBat
    password: ENC(2C4G7sdQSEwHUEnZMxQOVNHkZxTQ4DoT)
    url: jdbc:oracle:thin:@//10.10.55.1110:1521/objPro

3、修改启动命令

在启动命令之后增加秘钥配置

--jasypt.encryptor.password=BD9FA15C-7976-47DA-B8D5-E2438115F937


java -jar  SpringbootPro.jar --jasypt.encryptor.password=BD9FA15C-7976-47DA-B8D5-E2438115F937
06-05 23:47