Springboot采用jasypt加密配置的项目实践
作者:竹鹿众猿
前言
在以往的多数项目中,配置文件中的数据库密码、redis密码、nacos密码等敏感性信息一般是以明文形式存在,存在泄露的风险,因此,对敏感信息加固是很有必要,加固的一个重要环节就是对重要信息做加密处理。
这里简单的介绍一下Jasypt加密
一、Jasypt简介
Jasypt 是一个 java 库,可以使开发者不需要太多操作来给 Java 项目添加基本加密功能,而且不需要知道加密原理。Jasypt 为开发人员提供了一种简单易用加密功能,包括:密码认证、字符串加密等。
二、运用场景
一般来说,项目配置文件里,所有涉及信息安全的配置项(或字段)都应该做处理,典型的比如:
- 数据库密码,如mysql、oracle
- 缓存中间件的密码,如 redis、mongodb
- 其他中间件,如消息中间件、zk、nacos等
- 第三方服务的,如appid、 Access_Key
- …
三、整合Jasypt
官方示例:GitHub - ulisesbocchio/jasypt-spring-boot-samples: Sample apps using jasypt-spring-boot
3.1.环境配置
- ✅SpringBoot 2.0以上
- ✅Jasypt 3.0.5
- ✅jdk1.8
3.2.添加依赖
在项目 pom.xml 添加 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.5</version> </dependency>
3.3.添加Jasypt配置
jasypt: encryptor: password: 123456 algorithm: PBEWITHHMACSHA512ANDAES_256 iv-generator-classname: org.jasypt.iv.RandomIvGenerator salt-generator-classname: org.jasypt.salt.RandomSaltGenerator string-output-type: base64 provider-name: SunJCE pool-size: 1 key-obtention-iterations: 1000 property: # 标识为加密属性的前缀 prefix: ENC( # 标识为加密属性的后缀 suffix: )
2.4.编写加/解密工具类
package com.bexk.util; import java.util.Base64; import org.jasypt.encryption.pbe.PooledPBEStringEncryptor; import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig; /** * @Description: 加解密密算法 * @Author developer * @Date 2024/10/11 9:48 上午 */ public class JasyptUtil { /** * PBE 算法 */ public static final String PBE_ALGORITHMS_MD5_DES = "PBEWITHMD5ANDDES"; public static final String PBE_ALGORITHMS_SHA512_AES_256 = "PBEWithHMACSHA512ANDAES_256"; private JasyptUtil() { } /** * 加密 * * @param encryptedStr 加密字符串 * @param password 盐值 * @return */ public static String encrypt(String encryptedStr, String password) { return encrypt(encryptedStr, PBE_ALGORITHMS_MD5_DES, password); } /** * 加密 * * @param encryptedStr 加密字符串 * @param algorithm 加密算法 * @param password 盐值 * @return */ public static String encrypt(String encryptedStr, String algorithm, String password) { StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor(); EnvironmentPBEConfig config = new EnvironmentPBEConfig(); // 指定加密算法 config.setAlgorithm(algorithm); // 加密盐值 config.setPassword(password); config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator"); encryptor.setConfig(config); // 加密 return encryptor.encrypt(encryptedStr); } /** * 解密 * * @param decryptStr 解密字符串 * @param password 盐值 * @return */ public static String decrypt(String decryptStr, String password) { return decrypt(decryptStr, PBE_ALGORITHMS_MD5_DES, password); } /** * 解密 * * @param decryptStr 解密字符串 * @param algorithm 指定解密算法 * @param password 盐值 * @return */ public static String decrypt(String decryptStr, String algorithm, String password) { StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor(); EnvironmentPBEConfig config = new EnvironmentPBEConfig(); // 指定解密算法:解密算法要与加密算法一一对应 config.setAlgorithm(algorithm); // 加密秘钥 config.setPassword(password); config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator"); encryptor.setConfig(config); // 解密 return encryptor.decrypt(decryptStr); } }
修改配置文件
如图,通过编写加/解密工具类得到对应的加密结果,然后将配置文件的原始明文密码替换成上一步对应的结果,并通过 ENC(加密结果) 包裹起来。
加密前:
加密后:
2.5.自定义加密属性前缀和后缀
如果您只想为加密属性使用不同的前缀/后缀,则可以继续使用所有默认实现,只需覆盖 application.yml (或 application.properties)中的以下属性(property):
jasypt: encryptor: property: prefix: "ENC@[" suffix: "]"
2.6.防止密码泄露措施
若使用的是默认的加密规则,会让当自定义加密盐值(jasypt.encryptor.password) 泄漏,可能变得不安全。那么如何进一步防止密码泄露呢?
2.61.自定义加密器
自定义加密规则非常简单,只需要提供自定义的加密器配置类,然后通过jasypt.encryptor.bean配置指定加密配置类即可。
@Bean(name = "encryptorBean") static public StringEncryptor stringEncryptor() { PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); SimpleStringPBEConfig config = new SimpleStringPBEConfig(); config.setPassword("password"); config.setAlgorithm("PBEWithHMACSHA512ANDAES_256"); config.setKeyObtentionIterations("1000"); config.setPoolSize("1"); config.setProviderName("SunJCE"); config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator"); config.setStringOutputType("base64"); encryptor.setConfig(config); return encryptor; }
也将自定义加密器添加到 Spring IoC 容器中。
@Configuration public class JasyptConfig { /** * 加解密盐值 */ @Value("${jasypt.encryptor.password}") private String password; // @Bean("jasyptStringEncryptor") @Bean("encryptorBean") public StringEncryptor myStringEncryptor() { PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); SimpleStringPBEConfig config = new SimpleStringPBEConfig(); config.setPassword("password"); config.setAlgorithm("PBEWithHMACSHA512ANDAES_256"); config.setKeyObtentionIterations("1000"); config.setPoolSize("1"); config.setProviderName("SunJCE"); config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator"); config.setStringOutputType("base64"); encryptor.setConfig(config); return encryptor; } }
修改配置文件
jasypt: encryptor: # 指定加解密bean的名称,默认jasyptStringEncryptor bean: encryptorBean # 盐值 password: 123456 #省略其它
注意事项:Jasypt默认加解密器bean的Name为 jasyptStringEncryptor,若不想在配置文件中指定自定义加密器名称,需将自定义加密器bean的Name设置为jasyptStringEncryptor,否则将不生效。
Springcloud项目最好不要采用自定义,容易出现找不到bean的问题。
2.6.2通过环境变量指定加密盐值
方式一:直接作为程序启动时的命令行参数
java -jar test.jar --jasypt.encryptor.password=盐值
方式二:直接作为程序启动时的应用环境变量
java -Djasypt.encryptor.password=盐值 -jar test.jar
如果通过Docker部署,请在ENTRYPOINT加上对应参数,比如:
ENTRYPOINT ["java","-Djasypt.encryptor.password=test","-jar","test.jar"]
方式三:直接作为系统环境变量
1. 设置系统环境变量 :JASYPT_PWD
在windows系统设置:
在eclipse设置,如图:
在idea中设置,需要通过VM options设置,如图:
在linux系统设置
#打开全局配置文件: sudo vim /etc/profile #编辑全局配置文件: export JASYPT_PWD=nrmZtkF7T0kjG #重载profile配置文件: source /etc/profile
2. Spring Boot的项目配置文件指定系统环境变量:
jasypt: encryptor: password: ${JASYPT_PWD:123456}
总结
本文介绍了如何在Springboot项目中使用Jasypt对配置文件中的敏感信息进行加密,包括环境配置、依赖添加、配置设置、自定义加密器和使用环境变量管理盐值,以提升项目的安全性。
到此这篇关于Springboot采用jasypt加密配置的项目实践的文章就介绍到这了,更多相关Springboot jasypt加密内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!