目录
一、背景
最近接收到网安的系统安全漏洞通知,其中有一个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 然后将明文密码放进去进行加密,再输出解密后的密码,看是否一致,那如下结果,看起来是一致的
这个时候我们再运行一次,发现加密后的代码跟之前的不一样了,那有人可能担心了,那密码到底是按照哪个呢?答案就是,jasypt加密每次加密产生的密文都不一样,然后不一样的密文解密产生的结果是一样的,也就是说,随便写一个生成的密文都可以。
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
然后yml中删除jasypt加密秘钥,也就是这些
三、生产实现
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