SpringBoot项目配置明文密码泄露问题的处理方式
作者:北亮bl
项目配置明文密码泄露问题的处理
在项目开发过程中,需要配置数据库连接密码、Redis密码、网盘上传的AK/SK等敏感信息,都需要保存在配置文件里,或者配置中心。
这些信息如果泄露,还是会造成一定的困扰,这里介绍2种处理方案:
1、使用系统环境变量储存密码
比如K8S的环境变量、Windows的环境变量、Centos的环境变量等等,
然后在程序里使用 System.getenv()方法读取。
这种方式的好处:只有运维人员知道,连开发都不知道生产的密码。
密码变更也简单,运维直接操作就好了。
缺点就是部署时,容易遗漏,不过可以通过统一的环境镜像来处理。
一般推荐这种方式
注:如果变更密码,还是要考虑重启一下服务器上的所有服务,避免缓存了旧密码,导致服务故障。
2、密码还是写在程序的配置文件里
或者nacos之类的配置中心, 但是不使用明文,而是使用加密后的串。 同时在启动命令行里,指定密码参数。 下面介绍一下这种加密方式:
2.1、添加依赖,参考:https://github.com/ulisesbocchio/jasypt-spring-boot
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.4</version> </dependency>
2.2、对文本进行加密,假设密码为123456,加密代码如下(建议部署一个加密后台,给开发用):
// 参考 https://github.com/ulisesbocchio/jasypt-spring-boot PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); SimpleStringPBEConfig config = new SimpleStringPBEConfig(); config.setPassword("123456"); // 默认值 config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256"); config.setKeyObtentionIterations("1000"); config.setPoolSize("1"); config.setProviderName("SunJCE"); config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator"); config.setStringOutputType("base64"); encryptor.setConfig(config); System.out.println("beinet 加密后: " + encryptor.encrypt(username));
上面的代码输出:beinet 加密后: 8LJb3ICopErpPuEw1S/3rHc2fkk1qPScP0ODDbnmuSBjY6NJqN1oZcAxNDVl06qv
2.3、把加密后的文本,套上 ENC()函数,写入yml配置里:
pwdTest: ak: ENC(8LJb3ICopErpPuEw1S/3rHc2fkk1qPScP0ODDbnmuSBjY6NJqN1oZcAxNDVl06qv)
2.4、配置一下IDEA的Java启动命令行参数:
点击右上角 Edit Configurations… 在右侧Configuration=>Environment=>VM options的右边添加:
-Djasypt.encryptor.password=123456
2.5、运行代码验证一下:
@Value("${pwdTest.ak}") private String ak; @Override public void run(String... args) throws Exception { System.out.println(ak); }
可以看到,能成功打印出解密后的 beinet
给配置文件中用户名密码加密
原配置文件内容
详细操作步骤
1、在pom.xml文件中加依赖
<!--明文加密--> <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot</artifactId> <version>2.0.0</version> </dependency>
2、重新加载pom文件(因为可能会出现新加的依赖maven不生效) 3、找到maven仓库中的上面的依赖的位置
eg:我的位置是这里,请注意自己的位置(肯定是在org路径下)
4、打开PowerShell窗口(在jar包目录中按住shift+鼠标右键)
5、输入命令,执行jar包加密
java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input=“Zhiradar@135” password=Zhiradar@135 algorithm=PBEWithMD5AndDES
注:input=" ",分号中的内容为原配置文件中的需要加密的数据,该数据必须在双引号内
eg: input=“Zhiradar@135”
password= ,没有引号,并且=号后面的值是你自己起的,叫啥都行(尽量复杂一点,都是为了安全性)
eg1: password=sdkjfhkhs
eg2: password=woshinibaba@163
图示:
- 绿色框里的为原配置文件用户名和密码
- 蓝色框里的为盐值(盐值就是你自己起的那个加密数据)
- 黄色框里的是执行上述命令后生成的新配置文件中的用户名和密码
新配置文件内容
jasypt.encryptor.password=${JASYPT_ENCRYPTOR_PASSWORD}
这个是服务启动时候需要给配置文件增加的环境变量参数(就是上面自己起的)
JASYPT_ENCRYPTOR_PASSWORD也是自己起的名字
要对应启动jar包或者启动项目是配置的环境变量用的
jasypt.encryptor.algorithm=PBEWithMD5AndDES
这个是加密方式,其实默认的就是这种
6、在启动类上面加上注解
@EnableEncryptableProperties
表示启动项目就开启加密配置
7、启动项目验证配置正确不正确 1)打成jar包
执行jar包形式
java -DJASYPT_ENCRYPTOR_PASSWORD=Zhiradar@135 -jar .\xxl-job-admin-2.0.2-SNAPSHOT.jar
JASYPT_ENCRYPTOR_PASSWORD=Zhiradar@135
JASYPT_ENCRYPTOR_PASSWORD自己在配置文件中配置的
Zhiradar@135 盐值也是自己起的
2) 在IDEA中启动
run–>Edit Configuarations
以上为xxl-job框架中的admin模块用户名和密码加密(涉及到启动项目后会在可视化平台输入用户名和密码)
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。