网站首页 > 博客文章 正文
1 简介
在上一篇文章中,介绍了Jasypt及其用法,具体细节可以查看【Java库】如何使用优秀的加密库Jasypt来保护你的敏感信息?。如此利器,用之得当,那将事半功倍。本文将介绍Springboot整合Jasypt,实现配置信息的安全,如数据库连接、账号和密码、接口凭证信息等。
Jasypt可以为Springboot加密的信息很多,主要有:
- System Property 系统变量
- Envirnment Property 环境变量
- Command Line argument 命令行参数
- Application.properties 应用配置文件
- Yaml properties 应用配置文件
- other custom property sources 其它配置文件
经测试,Springboot 2.1.9版本与jasypt-spring-boot最新版本的3.0.0和2.1.2均有问题,本文使用2.1.1成功。
2 如何加入依赖
Jasypt整合到Springboot是另一个开源项目jasypt-spring-boot,主要有三种整合方式:
2.1 jasypt-spring-boot-starter
如果项目使用@SpringBootApplication或@EnableAutoConfiguration注解,在pom中加入以下依赖即可对整个Spring的环境的配置信息进行加密解密。
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>2.1.1</version> </dependency>
2.2 jasypt-spring-boot
如果项目不使用@SpringBootApplication或@EnableAutoConfiguration注解,我们就使用下面的依赖,然后在配置Java类中加上注解@EnableEncryptableProperties。
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot</artifactId> <version>2.1.1</version> </dependency>
配置类如下:
@Configuration @EnableEncryptableProperties public class MyApplication { }
2.3 只对特定配置加密解密
如果不想使用以上两种方式对所有配置信息都进行加密解密的话,可以使用注解@EncryptablePropertySource指定配置文件,依赖如下:
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot</artifactId> <version>2.1.1</version> </dependency>
配置类如下:
@Configuration @EncryptablePropertySource(name = "EncryptedProperties", value = "classpath:encrypted.properties") public class MyApplication { }
3 生成加密字符
生成加密字符有多种方式,在实践中使用过以下几种方式。
3.1 Java命令行
Jasypt提供了一个类专门用于加密解密,提供了main方法,调用如下:
java -cp ./jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI password=pkslow algorithm=PBEWithMD5AndTripleDES input=larry
输出为:
----ENVIRONMENT----------------- Runtime: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 25.212-b10 ----ARGUMENTS------------------- input: larry algorithm: PBEWithMD5AndTripleDES password: pkslow ----OUTPUT---------------------- SUfiOs8MvmAUjg+oWl/6dQ==
3.2 脚本命令
Jasypt为我们提供了脚本,可以直接用于加密解密,从http://www.jasypt.org/download.html可以下载。下载解压后的文件有:
# 解压后文件 LICENSE.txt NOTICE.txt README.txt apidocs bin lib # bin文件夹的文件 decrypt.bat decrypt.sh digest.bat digest.sh encrypt.bat encrypt.sh listAlgorithms.bat listAlgorithms.sh
在bin目录下面,我们可以根据自己的系统选择使用什么脚本来生成密文,使用参数与Java命令一样。其实这些脚本就是封装了一个调用Java类的工具。使用如下:
$ sh encrypt.sh password=pkslow algorithm=PBEWithMD5AndTripleDES input=larry ----ENVIRONMENT----------------- Runtime: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 25.212-b10 ----ARGUMENTS------------------- input: larry algorithm: PBEWithMD5AndTripleDES password: pkslow ----OUTPUT---------------------- xRvdeEnk7zgKtX5uVGCIug==
3.3 Java代码
既然是Java的库,那肯定能用Java代码来加密解密了。具体细节可以参考【Java库】如何使用优秀的加密库Jasypt来保护你的敏感信息?。
4 配置密文
生成密文后,就要把密文配置在相应的位置,如下:
username: ENC(SUfiOs8MvmAUjg+oWl/6dQ==) jasypt: encryptor: password: pkslow algorithm: PBEWithMD5AndTripleDES
配置密文的默认格式:ENC(密文),这个格式可以通过jasypt.encryptor.property.prefix和jasypt.encryptor.property.suffix配置,这里不再演示。
5 如何安放你的密钥
密钥是非常重要的信息,放在什么地方,决定着你的密文是否真的安全。可以有以下几类方式:
(1)放在application.properties
这样能获得配置文件的人就能知道密钥,不够安全。但它是一种方便简单的方式。存在密文和密钥放在同一个配置文件的风险。
(2)JVM参数
在启动Java程序时加参数:-Djasypt.encryptor.password=pkslow,这样就不会把密钥放在代码中去了。
(3)服务器的环境变量
把密钥放在linux系统的环境变量中去,只有能拿到服务器访问权限的人,才有可能知道密钥在哪。例如:
# 配置profile文件 export JASYPT_PASSWORD = pkslow # 生效 source /etc/profile # 运行java程序时 java -jar -Djasypt.encryptor.password=${JASYPT_PASSWORD} xxx.jar
(4)使用自定义的Encryptor来存放
以上我们都使用了官方提供的Encryptor,其实我们是可以自定义的,如下:
@Bean("jasyptStringEncryptor") 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.RandomIvGenerator"); config.setStringOutputType("base64"); encryptor.setConfig(config); return encryptor; }
把密钥写在代码里,只有能获得jar包并反编译的人,才能获得密文。
如果我们把密钥的一部分写在代码里,另一部分通过外部方式来配置,这样就会更加安全。
6 结果测试
我们已经完成了密文的生成,现在我们测试一下是否能正常解密,测试代码如下:
@RestController @RequestMapping("/jasypt") public class JasyptController { @Value("${username}") private String username; @GetMapping("/name") public Mono<String> sendNormalText() { return Mono.just(username); } }
访问该接口,能返回加密前的字符串,整个流程测试成功:
7 总结
本文简介了Springboot整合Jasypt实现配置信息的安全化,在实际项目中应用还是很多的。
另外,如果项目中是采用Spring Cloud Config的,它提供了统一的加解密方式,也方便使用。但如果应用配置没有走配置中心,还是应该使用Jasypt。
欢迎关注公众号<南瓜慢说>,将持续为你更新...
多读书,多分享;多写作,多整理。
猜你喜欢
- 2024-11-13 spring boot配置文件敏感字段加密
- 2024-11-13 Spring Boot数据库密码加密的配置方法
- 2024-11-13 Spring Boot安全之application配置信息加密
- 2024-11-13 如何在SpringBoot项目中实现加密?
- 2024-11-13 SpringBoot进阶-SpringBoot如何实现配置文件脱敏?
- 2024-11-13 加密SpringBoot配置文件技巧(加密pdf文件如何解密编辑)
- 2024-11-13 Spring Boot版本和Jasypt版本的兼容性问题?
- 2024-11-13 SpringBoot加密配置属性(springboot配置密码加密)
- 2024-11-13 SpringCloud-OAuth2(二):实战篇(oauth2.0 springcloud)
- 2024-11-13 SpringBoot 配置文件这样加密,才足够安全!
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)