SpringBoot项目application配置文件数据库密码上传git暴露问题解决方案
问题
问题:
项目中含有配置文件,配置文件中含有数据库的用户名和密码,上传git直接对外网开放。那后果会怎样可想而知。
jasypt 加解密
jasypt(Java Simplified Encryption)是一个简化的开源 Java 加密工具库
Springboot引入jasypt
<!-- Java Simplified Encryption--><dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.4</version></dependency>
加解密测试
@Testpublicvoidtest1(){// 参考 https://github.com/ulisesbocchio/jasypt-spring-bootPooledPBEStringEncryptor encryptor =newPooledPBEStringEncryptor();SimpleStringPBEConfig config =newSimpleStringPBEConfig();// 加密密码
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);String encrypt = encryptor.encrypt("hello ...");System.out.println("加密后: "+ encrypt);String decrypt = encryptor.decrypt(encrypt);System.out.println("解密后: "+ decrypt);}
输出
加密后: nOvch7+afYNA0xcbPQq1yzmK0yLj7GmCQR6YpVFH61IkMnTEULVgJz2b2yU3DKbs
解密后: hello ...
springboot使用jasypt
使用很简单,只需要引入jasypt-spring-boot-starter依赖,然后将配置文件中的明文换成"ENC(密文即可)“,例如密码为"hello …”,加密密码为"123456",加密之后的密码为"nOvch7+afYNA0xcbPQq1yzmK0yLj7GmCQR6YpVFH61IkMnTEULVgJz2b2yU3DKbs"
spring:datasource:type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/scott?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8username: root
password: ENC(nOvch7+afYNA0xcbPQq1yzmK0yLj7GmCQR6YpVFH61IkMnTEULVgJz2b2yU3DKbs)
项目启动时添加启动参数"-Djasypt.encryptor.password=123456"
原理简单解析
拿到配置信息>判断配置信息是否以"ENC(“开头并且以”)"结尾,如果是就拿到提取出密文>获取到加解密key>使用jasypt解密密文>将密文替换为明文
注意:在运行环境是可以拿到明文的,例如通过@Value(“${spring.datasource.password}”)拿到的依然是明文,但在源码级别是看不到明文的,而且加解密密码是通过环境变量提供的,所以即便别人看到密文也解不开,也访问不了我们的数据库.
版权归原作者 JAVA领域优质创作者 所有, 如有侵权,请联系我们删除。