另外,通过 DEBUG 调试可以看到是一个 DefaultLazyEncryptor 实例:
当然也支持自定义的 Encryptor,有需要的可以自行定制。
如果不想用测试这种方法生成密文,也可以使用 Maven 插件,这就是前面为什么要加 Maven 插件(可选)的原因,使用方式如下:
mvn jasypt:encrypt-value -Djasypt.encryptor.password="G9w0BAQEFAASCBKYwggSiAgEAAoIBAQC" -Djasypt.plugin.value="javastack"
4.1.4 敏感信息解密
将上一步生成的密文填充到 application 配置文件中:
javastack: username: ENC@[K4DsOasic/5Cvu2Y6Ca5dyaw2+eejgqRfhDWB0itMWRONrIN+wLy3xkGbSfYxQ1b] password: ENC@[UeZWoPt3ZhSs2wPUAKTF21dgnhzimB+FNNiQjpJoPEhwYzI5WH3IWboZ5Wn+5Rgf]
注意 ENC@[] 这个占位符是上面进行自定义配置的。
然后再写一个程序尝试打印出来:
/** * 来源微信公众号:Java技术栈 * 作者:栈长 */ @Slf4j @SpringBootApplication public class Application { @Value("${javastack.username}") private String username; @Value("${javastack.password}") private String password; /** * 来源微信公众号:Java技术栈 * 作者:栈长 */ public static void main(String[] args) { SpringApplication.run(Application.class); } /** * 来源微信公众号:Java技术栈 * 作者:栈长 */ @Bean public CommandLineRunner commandLineRunner() { return (args) -> { log.info("javastack.username = {}", username); log.info("javastack.password = {}", password); }; } }
栈长写了一个 CommandLineRunner,在系统启动之后将密文的原文打印出来,不需要做任何处理,直接注入、打印就行,看是不是明文。
系统启动之后:
结果正常,自动解密成功。
本节教程所有实战源码已上传到这个仓库:
https://github.com/javastacks/spring-boot-best-practice
4.2 密钥安全性
我们把 Jasypt 密钥(password)存放在 application 配置文件中,这样敏感信息还是在项目代码中,也不是太安全,建议通过命令行参数的方式传入,如在 IDEA 中这样设置:
如果是生产环境,可以通过命令的方式传入:
java -Djasypt.encryptor.password=password -jar xx.jar
甚至还可以配置在服务器环境变量中,因为 StringEncryptor 可以通过 系统参数、配置文件、命令行参数、环境变量 等等方式进行构造。
这样 Spring Boot 中的配置信息就彻底安全了!
Jasypt Spring Boot 功能远不止如此,实际功能要更强大,这里栈长只是介绍了简单的运用,更多的自定义的需求大家可以参考官方文档,那里有更详细的教程。


