一、Jasypt简介
Jasypt是一个Java简易加密库,用于加密配置文件中的敏感信息,如数据库密码。jasypt库与springboot集成,在实际开发中非常方便。 1、Jasypt Spring Boot 为 spring boot 应用程序中的属性源提供加密支持,出于安全考虑,Spring boot 配置文件中的敏感信息通常需要对它进行加密/脱敏处理,尽量不使用明文,要实现这一点,办法有很多,自己手动对敏感信息进行加解密也是可以的。 2、在程序界有需求就有人奉献,Jasypt 开源安全框架就是专门用于处理 Spring boot 属性加密的,在配置文件中使用特定格式直接配置密文,然后应用启动的时候,Jasypt 会自动将密码解密成明文供程序使用。 1)Jasypt 加密属性配置格式:secret.property=ENC(nrmZtkF7T0kjG/VodDvBw93Ct8EgjCA+),ENC() 就是它的标识,程序启动的时候,会自动解密其中的内容,如果解密失败,则会报错。 2)所以获取这些属性值和平时没有区别,直接使用如 @Value(“${secret.property}”) 获取即可,取值并不需要特殊处理。 3、jasypt 同一个密钥(secretKey)对同一个内容执行加密,每次生成的密文都是不一样的,但是根据根据这些密文解密成原内容都是可以的.简介
Jasypt 官方使用文档:http://www.jasypt.org/
GitHub地址:https://github.com/ulisesbocchio/jasypt-spring-boot。
二、实践操作
1.创建 Spring Boot
项目
配置主启动类采用 @SpringBootApplication
配置
2.引入 jasypt-spring-boot
组件(3.x
和 2.x
加密算法有变化)
<!-- jasypt 配置文件敏感信息加解密 --> <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency> <!-- jasypt 配置文件敏感信息加解密 --> <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>2.1.2</version> </dependency>pom
3.生成密文代码
package com; import org.jasypt.encryption.pbe.StandardPBEStringEncryptor; import org.jasypt.encryption.pbe.config.EnvironmentPBEConfig; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @SpringBootTest @RunWith(SpringRunner.class) public class JasyptUtil { private final static String SECRECT = "1234qwer"; //秘钥 private final static String ALGORITHM = "PBEWithMD5AndDES"; //加密算法 @Test public void testEncrypt() throws Exception { System.out.println("密文密码:" + encrypt("myPassword")); } private String encrypt(String text){ StandardPBEStringEncryptor standardPBEStringEncryptor = new StandardPBEStringEncryptor(); EnvironmentPBEConfig config = new EnvironmentPBEConfig(); config.setAlgorithm(ALGORITHM); config.setPassword(SECRECT); standardPBEStringEncryptor.setConfig(config); return standardPBEStringEncryptor.encrypt(text); } public String decrypt(String text) { StandardPBEStringEncryptor standardPBEStringEncryptor = new StandardPBEStringEncryptor(); EnvironmentPBEConfig config = new EnvironmentPBEConfig(); config.setAlgorithm(ALGORITHM); config.setPassword(SECRECT); standardPBEStringEncryptor.setConfig(config); return standardPBEStringEncryptor.decrypt(text); } }仅作为生成密文的工具类
4. yml加密配置(jasypt配置一定要放最上面)
jasypt加密的密匙(写到启动参数里面)
# jasypt 密码加密配置 jasypt: encryptor: # 加密盐值 password: jasypt # 加密算法设置 3.0.0 以后 algorithm: PBEWithMD5AndDES iv-generator-classname: org.jasypt.iv.NoIvGenerator #用官方提供的保留字 ENC,将加密的密码包裹即可 spring: datasource: url: jdbc:mysql://xx.xx.xx.xx/xxxx?useUnicode=true&characterEncoding=utf8&useSSL=false username: root password: ENC(加密后的密码) driver-class-name: com.mysql.jdbc.Driveryml配置
PS:可以看到配置中特意配置了加密算法,原因是官方在 3.0.0 以后更改了加密算法,所以假如你不设置的话,使用网上的方法加密出来的密码启动就会报错,如图:
官方 issue:Failed to bind properties under ‘spring.datasource.password’ to java.lang.String` #154
三、配置salt盐值
如果秘钥写在代码或者配置文件,一旦代码泄露,那别人就可以使用秘钥解密我们的密文,这样对敏感信息加密的作用就不存在了,因此,秘钥不能以明文形式存储在代码或者配置文件中,下面就介绍一些安全的存储秘钥的形式。
jasypt: encryptor: password: ${ENCRYPT:123456} #jasypt加密的盐值,
通过idea设置盐值参数
点击右侧的加号,添加jasypt.encryptor.password,这样本地能正常启动,但是打包呢,往服务器上部署呢?
Mave打包和部署
指定某个项目设置打包参数或者全局设置
方式1:环境变量设置盐值
Windows系统环境变量设置盐值 可以通过系统环境变量设置盐值,在项目启动的时候先获取环境变量,然后传入对应的位置即可。假设我在系统环境变量配置了ENCRYPT=123456,只需在配置文件使用${ENCRYPT}即可获取到。不过再启动的时候一定要确保设置了该系统变量,不然肯定起不来哦。 jasypt: encryptor: password: ${ENCRYPT} # password: ${ENCRYPT:123456} #如果环境变量里没找到,则取冒号后边的默认值Windows系统环境变量设置盐值
打开/etc/profile文件 vim /etc/profile 在profile文件末尾插入salt(盐)变量 export ENCRYPT=123456 编译,使配置文件生效 source /etc/profile 运行 java -jar -Djasypt.encryptor.password=${ENCRYPT} test.jarLinux 系统环境变量配置
方式2:把秘钥当做程序启动时环境变量(推荐)
java -Djasypt.encryptor.password=秘钥 -jar xxx.jar
方式3:把秘钥当做程序启动时的命令行参数(推荐)
java -jar xxx.jar --jasypt.encryptor.password=秘钥
方式4:服务器配置文件
还有一种就是放到服务器上的某个位置,启动的时候加载该文件获取信息。有需要可自行编写自定义加密和解密器的逻辑代码。package vip.aster.admin.config; import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties; import lombok.extern.slf4j.Slf4j; import org.jasypt.encryption.pbe.StandardPBEStringEncryptor; import org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @author jin * @date 2024/2/5 * @Note */ @Configuration @EnableEncryptableProperties @Slf4j public class JasyptConfig { @Value("${jasypt.encryptor.password}") private String encryptorPass; /** * 配置StandardPBEStringEncryptor加解密器的配置 * @return */ @Bean public EnvironmentStringPBEConfig environmentStringPBEConfig() { log.info("encryptorPass:"+encryptorPass); EnvironmentStringPBEConfig environmentStringPBEConfig = new EnvironmentStringPBEConfig(); //设置算法 environmentStringPBEConfig.setAlgorithm("PBEWithMD5AndDES"); environmentStringPBEConfig.setPassword(encryptorPass); return environmentStringPBEConfig; } /** * 配置StandardPBEStringEncryptor加解密器 * @return */ @Bean("jasyptStringEncryptor") public StandardPBEStringEncryptor standardPBEStringEncryptor() { StandardPBEStringEncryptor standardPBEStringEncryptor = new StandardPBEStringEncryptor(); standardPBEStringEncryptor.setConfig(environmentStringPBEConfig()); return standardPBEStringEncryptor; } }SpringBoot3 配置
三、扩展
3.1使用jasypt3.0启动时报:Failed to bind properties under ‘xxx.xxx.xxx’ to java.lang.String
官方描述,3.0后默认支持的算法为PBEWITHHMACSHA512ANDAES_256 ,该种加密方式由sha512 加 AES 高级加密组成,需要JDK1.9以上支持或者添加JCE(Java Cryptography Extension无限强度权限策略文件)支持,否则运行会出现错误。- 解决方案1,降低版本。 降低jasypt的版本 - 使用2.x的版本
-
解决方案2,修改算法。将加密算法替换成PBEWithMD5AndDES 算法,并配置iv-generator-classname: 为org.jasypt.iv.NoIvGenerator值
3.2 sharing-jdbc使用注意版本对应
例如:sharding-jdbc4.1版本无法使用jasypt2.x的版本,需更新版本到3.x
<dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>4.1.1</version> </dependency> <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <!--版本与sharding有对应--> <version>3.0.5</version> </dependency>pom示例
解决方案:保持版本对应,并启动
java -jar xxx.jar --jasypt.encryptor.password=秘钥 --jasypt.encryptor.iv-generator-classname=org.jasypt.iv.NoIvGenerator
参考链接:
https://blog.csdn.net/li_wen_jin/article/details/111468221
https://blog.csdn.net/weixin_44299027/article/details/130564414
https://www.cnblogs.com/renyutao/p/14170511.html
https://blog.csdn.net/Rambo_Yang/article/details/107579388
https://blog.csdn.net/weixin_42469135/article/details/127265988
https://blog.csdn.net/libusi001/article/details/108465034
标签:加密,SpringBoot,配置文件,jasypt,org,import,password,config From: https://www.cnblogs.com/zt007/p/18123319