SpringBoot项目配置明文密码泄露问题处理

Posted 北亮bl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot项目配置明文密码泄露问题处理相关的知识,希望对你有一定的参考价值。

在项目开发过程中,需要配置数据库连接密码、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

以上是关于SpringBoot项目配置明文密码泄露问题处理的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot项目配置明文密码泄露问题处理

SpringBoot集成jasypt数据库密码加密

SpringBoot 配置文件这样加密,才足够安全!

Springboot实现ENC加密

如何抵御社工库类的黑客攻击?在明文密码已泄露的情况下保护自己?

Spring Boot项目application.yml文件数据库配置密码加密