在做项目的时候,我们经常看到配置文件中的密码等敏感字段在裸奔,有没有什么办法做一下加密工作呢?jasypt-spring-boot刚好解决这个问题,下面就来看看,它是怎么使用的吧!
首先,在pom.xml文件中引入jasypt-spring-boot包;
<!-- https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot -->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot</artifactId>
<version>3.0.4</version>
</dependency>
如果项目里已经有别的starter,那么就可以直接引入上面的包,否则请引入带starter的jasypt包。
<!-- https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot-starter -->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.4</version>
</dependency>
第二步,在启动类上增加注解:@EnableEncryptableProperties,开启配置文件字段的加密;

第三步,application.properties配置文件中加入加密密钥和解密前后缀标识;
// 加密秘钥
jasypt.encryptor.password=CodeSheep
// 解密标识
jasypt.encryptor.property.prefix=ENC@[
jasypt.encryptor.property.suffix=]
// 需要加密的字段
spring.datasource.password=123456
第四步,加入测试代码,为了方便我们直接在启动类里加测试代码;
@Autowired
private ApplicationContext applicationContext;
@Autowired
private StringEncryptor stringEncryptor;
@Override
public void run(String... args) throws Exception {
Environment environment = applicationContext.getBean(Environment.class);
// 首先获取配置文件里的原始明文信息
String mysqlOriginPswd = environment.getProperty("spring.datasource.password");
// 加密
String mysqlEncryptedPswd = encrypt( mysqlOriginPswd );
// 打印加密前后的结果对比 123456
System.out.println( "原始明文密码为:" + mysqlOriginPswd );
System.out.println( "====================================" );
// puUbA77wheMabQm0mY3mzESwN0loXqh5M2fCVhKIWEsTvY1JjXMAi8YEYKNFiObp
System.out.println( "原始明文密码加密后的结果为:" + mysqlEncryptedPswd );
}
/**
* 对字符串进行加密
* @paramoriginPassord
* @return
*/
private String encrypt(String originPassord) {
String encryptStr = stringEncryptor.encrypt(originPassord);
return encryptStr;
}
/**
* 对加过密的密文进行解密
* @paramencryptedPassword
* @return
*/
private String decrypt(String encryptedPassword) {
String decryptStr = stringEncryptor.decrypt(encryptedPassword);
return decryptStr;
}
通过StringEncryptor的encrypt方法进行加密,再通过decrypt方法进行解密。第五步,运行启动类,获取加密过的密文,并放到application配置文件中;

找到要替换的明文,并用加密前后缀标识包裹,替换原来的明文;
spring.datasource.password=ENC@[2c+NWn5q/sfAGm8RtnjcWzJEj8RMmgcim5UKkHD4PKjG/WqMBFbTU6ChW9CnFhGn]
调整代码,在启动类里获取加密过后的密码,看看能否正常解密,以保证正常使用。

第六步,重新启动主类运行代码测试,运行结果如下图所示:

加密使用的密钥放在配置文件里也不安全,别人拿到了它就可以解码出明文;可以在项目上线后,将密钥以命令行参数的形式传入,这也是保密的一种途径。除此之外,你还有其他更好的办法吗?
最后总结
通过这个demo可以看到使用jasypt-spring-boot架包对配置文件里的敏感字段有选择性的加密,执行起来非常简单。这里抛砖引玉只讲简单使用,如果有时间可以继续研究它的源码,看看它们是怎么实现的。怎么样,这个简单的demo你学会了吗?
网友评论