springboot配置⽂件加密
先看⼀份典型的配置⽂件
... 省略 ...
## 配置MySQL数据库连接
spring.datasource.sql.jdbc.Driver
spring.datasource.url=jdbc:mysql://x:3306/user?useUnicode=true&characterEncoding=utf-8 spring.datasource.username=root
spring.datasource.password=123456
## 配置Redis缓存连接
redis.host=x
redis.port=6379
redis.password=111111
## 配置SMS短信服务连接
ali.sms.access_key_id=2zHmLdxAes7Bbe2w
ali.sms.access_key_secret=bImWdv6iy0him8ly
... 省略 ...
这是节选⾃某个典型的Spring Boot项⽬的application.properties配置⽂件。
这乍⼀看没啥问题,很多⼈会觉得理所当然。包括我⾃⼰也看到过很多的项⽬(包括很多开源项⽬)是这么写的。
但仔细⼀琢磨,发现:
是的!很多项⽬的配置⽂件⾥,包括数据库密码、缓存密码、亦或是⼀些第三⽅服务的Key都是直接配在⾥⾯,没有做任何加密处理!
是的!
有⼈会说这个配置⽂件反正是我⾃⼰的,有啥风险?
这个嘛,之前倒是看到过⼀个例⼦,⼀个程序员把⾃⼰公司的项⽬代码上传到了⾃⼰的GitHub仓库⾥了,结果配置⽂件忘了处理,导致公司数据库泄露...
换个⾓度想,假如当时那个项⽬的配置⽂件⾥,所有重要信息都经过了加密,那这⼀幕⼤概率就不会发⽣了。所以,即使是项⽬的配置⽂件,重要的信息也得加密!
哪些信息要加密呢?
⼀般来说,项⽬配置⽂件⾥,所有涉及信息安全的配置项(或字段)都应该做处理,典型的⽐如:
⽤到的数据库、缓存的密码
⽤到的中间件、消息队列的密码
⽤到的各种第三⽅服务的Access_Key
其他第三⽅服务的通信信息
......等等
总⽽⾔之,关键字段都应该保护起来,最起码不能⽤明⽂直接写在配置⽂件⾥!
如何加密配置项呢?
⽅法⾮常简单,⼏个步骤即可完成,先来演⽰⼀个最简版本:
1、⾸先建⽴⼀个基础的Spring Boot⼯程
这就不再赘述了
2、引⼊jasypt-spring-boot加密组件
通过jasypt-spring-boot这个开箱即⽤的加密组件来引⼊Jasypt这个强⼤的加密库
com.github.ulisesbocchio
java加密方式有哪些jasypt-spring-boot-starter
3.0.2
3、配置加密密钥
在Spring Boot的项⽬配置⽂件application.properties⾥新增如下配置:
可以理解为jasypt会使⽤这个⾃定义加密密钥,对配置⽂件⾥的重要项进⾏加密。
4、加密测试
为了便于测试,我们直接扩展Spring Boot项⽬的启动类,项⽬启动时执⾏加密测试代码,直接看效果@SpringBootApplication publicclassSpringBootConfigEncryptApplicationimplementsCommandLineRunner{
@Autowired
privateApplicationContext appCtx;
@Autowired
privateStringEncryptor codeSheepEncryptorBean;
publicstaticvoidmain(String[] args){
SpringApplication.run(SpringBootConfigEncryptApplication.class,args);
}
@Override
args)throwsException{
Environment environment = Bean(Environment.class);
// ⾸先获取配置⽂件⾥的原始明⽂信息
String mysqlOriginPswd = Property("spring.datasource.password");
String redisOriginPswd = Property("redis.password");
String aliSmsOriginAk = Property("ali.sms.access_key_secret");
// 加密
String mysqlEncryptedPswd = encrypt( mysqlOriginPswd );
String redisEncryptedPswd = encrypt( redisOriginPswd );
String aliSmsEncryptedAk = encrypt( aliSmsOriginAk );
// 打印加密前后的结果对⽐
System.out.println("MySQL原始明⽂密码为:"+ mysqlOriginPswd );
System.out.println("Redis原始明⽂密码为:"+ redisOriginPswd );
System.out.println("阿⾥云SMS原始AccessKey密码为:"+ aliSmsOriginAk );
System.out.println("====================================");
System.out.println("MySQL原始明⽂密码加密后的结果为:"+ mysqlEncryptedPswd );
System.out.println("Redis原始明⽂密码加密后的结果为:"+ redisEncryptedPswd );
System.out.println("阿⾥云SMS原始AccessKey密码加密后的结果为:"+ aliSmsEncryptedAk );
}
privateStringencrypt( String originPassord ){
String encryptStr = pt( originPassord );
returnencryptStr;
}
privateStringdecrypt( String encryptedPassword ){
String decryptStr = codeSheepEncryptorBean.decrypt( encryptedPassword );
returndecryptStr;
}
}
运⾏项⽬,控制台打印:
MySQL原始明⽂密码为:123456
Redis原始明⽂密码为:111111
阿⾥云SMS原始AccessKey密码为:bImWdv13da894mly
====================================
MySQL原始明⽂密码加密后的结果为:IV7SyeQOfG4GhiXeGLboVgOLPDO+dJMDoOdmEOQp3KyVjruI+dKKeehsTriWPKbo Redis原始明⽂密码加密后的结果为:litUkxJ3fN6+//Emq3vZ+y4o7ZOnZ8doOy7NrgJIDLoNWGG0m3ygGeQh/dEroKvv
阿⾥云SMS原始AccessKey密码加密后的结果为:
MAhrOs20DY0RU/c1IKyLCt6dWZqLLOO4wUcK9GBgSxNII3C+y+SRptors+FyNz55xNDslhDnpWllhcYPwZsO5A==
5、修改配置⽂件,替换待加密配置项
我们拿到上⼀步得到的加密结果,将配置⽂件中的原始明⽂密码替换成上⼀步对应的结果即可,就像这样:
所以墙裂建议配置⽂件⾥的所有重要信息都这样处理!
6、查看密码解密结果
@SpringBootApplication publicclassSpringBootConfigEncryptApplicationimplementsCommandLineRunner{ @Autowired
privateApplicationContext appCtx;
@Autowired
privateStringEncryptor codeSheepEncryptorBean;
publicstaticvoidmain(String[] args){
SpringApplication.run(SpringBootConfigEncryptApplication.class,args);
}
@Override
args)throwsException{
Environment environment = Bean(Environment.class);
// ⾸先获取配置⽂件⾥的配置项
String mysqlOriginPswd = Property("spring.datasource.password"); String redisOriginPswd = Property("redis.password");
String aliSmsOriginAk = Property("ali.sms.access_key_secret");
// 打印解密后的结果
System.out.println("MySQL原始明⽂密码为:"+ mysqlOriginPswd );
System.out.println("Redis原始明⽂密码为:"+ redisOriginPswd );
System.out.println("阿⾥云SMS原始AccessKey密码为:"+ aliSmsOriginAk );
}
}
打印结果:
MySQL原始明⽂密码为:123456
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论