【配置文件密码加密】一种简单的在SpringBoot中非明文配置密码的实现方案
- 在一些项目中,应各方要求,密码不能直接配置在配置文件中,否则会报高危风险。为简化配置、提高安全程度,此处设计了一种密码加密方式,使用这种方式可以不让开发人员知晓密码,仅部署人员知晓,且对部署人员只提供加密方法不提供解密方法。
- 此方法无法应对反编译,如果要应对反编译,可以采用一些混淆、密钥授权等方案,这里大家一起讨论下,有没有只需要本机计算又比较安全的方案
- 这种方式甚至可以把使用的哪个数据库、数据库在哪个服务器都隐藏起来
- 主要目的是降低配置文件被提取到之后导致敏感信息泄露
一、通常的不安全做法示例
- 通常情况下,我们开发Spring Boot/Cloud时会将基本的密码配置在yml、properties文件或配置中心中,这些方法都是明文配置密码的,存在高危风险。通常的配置方法如下:
spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456
二、按照本方案后,配置文件的配置
- 按本方案操作后,上文代码中password可以不填或者填写一些误导的内容,如
spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghaiusername: rootpassword: 一个错误的密码
三、系统改造
- 此部分讲述系统的改造方法,想先了解运维人员如何使用的,可先看第四部分
1.加密方法
- 提供一个加密工具类,Spring Boot的main方法加载的时候,就执行这个方法,对mian的String[] args的参数进行修改
- 即:通过改变启动参数的方式配置密码
- 此处不做赘述,请各位大佬阅读代码
import cn.hutool.core.io.FileUtil;
import cn.hutool.json.JSONArray;
import lombok.extern.slf4j.Slf4j;import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.io.File;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Base64