Spring-boot项目中properties文件中的密码明文上传到公开的远程仓库后,不安全,可以使用Ulisesbocchio对配置文件进行加密
1.添加maven依赖:
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
2.进入本地maven库 .m2\repository\org\jasypt\jasypt\1.9.2路径下,执行加密命令:
java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input=aaaaaa password=111111 algorithm=PBEWithMD5AndDES
执行命令后会出现加密后密码:
3.将properties.yml(bootstrap.yml)配置文件中需要加密的数据替换成 ”ENC(密文)” :
spring:
application:
name: client
cloud:
nacos:
discovery:
username: admin
password: ENC(MsvjXO4LXZ18GP2WoONZNA==)
server-addr: ${NACOS_HOST:127.0.0.1}:${NACOS_POST:8848}
group: DEFAULT_GROUP
namespace: ${NACOS_NAMESPACE:dev}
enabled: true
register-enabled: true
4 将我们的加密盐放到项目的idea启动项中、和启动命令的启动项中
配置项中
--jasypt.encryptor.password=111111
启动项中:
java -jar test-0.0.1-SNAPSHOT.jar --jasypt.encryptor.password=111111
5 启动项目、运行代码正常!
注意: 网上有很多人将盐配置到了配置文件中,像下边:
jasypt:
encryptor:
password: 1111111111
spring:
application:
name: client
cloud:
nacos:
discovery:
username: admin
password: ENC(MsvjXO4LXZ18GP2WoONZNA==)
server-addr: ${NACOS_HOST:127.0.0.1}:${NACOS_POST:8848}
group: DEFAULT_GROUP
namespace: ${NACOS_NAMESPACE:dev}
enabled: true
register-enabled: true
我认为这样和没有进行加密是一样的,稍微费点事一样可以获取到密码(因为其加密算法是可逆的),为此我做了以下实验:
import org.jasypt.util.text.BasicTextEncryptor;
public class EncryptConfigUtil {
public static void main(String[] args) {
String salt = "111111"; // 盐值
String password = "aaaaaa"; // 被加密的密码
BasicTextEncryptor encryptor = new BasicTextEncryptor();
encryptor.setPassword(salt);
// 验证利用配置文件中配置的密文和盐值获取的明文
String decryptedMessage1 = encryptor.decrypt("MsvjXO4LXZ18GP2WoONZNA==");
System.out.println("利用配置文件中配置的密文和盐值获取的明文 -->" + decryptedMessage1);
// 加密
String encryptedMessage = encryptor.encrypt(password);
System.out.println("密文 -->" + encryptedMessage);
// 解密
String decryptedMessage = encryptor.decrypt(encryptedMessage);
System.out.println("明文 -->" + decryptedMessage);
}
}
运行结果:
你看,是不是就拿到了呢!
详细原理可以查看源码:
org.jasypt.util.text.BasicTextEncryptor与org.jasypt.encryption.pbe.StandardPBEStringEncryptor