赞
踩
在Spring Boot中,有很多口令需要加密,如数据库连接密码、访问第三方接口的Token等。常见的方法就是用jasypt对口令进行加密。
实际上,jasypt可以对配置文件中任意配置项的值进行加密,不局限于对密码的加密。
1.在pom.xml中添加jasypt相关依赖
<!-- jasypt-spring-boot-starter -->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
2.对需要加密的字符串进行加密,获取密文
网上有很多文章告诉你通过命令行,直接指定加密算法、加密实现类等参数,调用jasypt-x.x.x.jar
对字符串进行加密。由于不同版本jasypt的默认加密算法和其它默认配置有差异,而且要想知道pom.xml
中依赖的jasypt-spring-boot-starter
依赖的jasypt-x.x.x.jar
具体是哪个版本,还得查看jasypt-spring-boot-starter
的pom.xml
文件,再查看其parent的pom.xml
文件,找到jasypt.version
的值,才能知道jasypt-x.x.x.jar
的具体版本。
所以,直接在Spring Boot中注入用于字符串加密的Bean,然后调用加密方法对字符串加密。加密完成后,加密的代码就不再需要了(后续如果还有加密需求,重新用下面代码加密一遍即可)。
加密代码:
package com.example.study; import org.jasypt.encryption.StringEncryptor; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.ArrayList; import java.util.List; @SpringBootTest public class MyPropertiesTest { /** * 用于加密字符串的接口,默认实现类是DefaultLazyEncryptor */ @Autowired private StringEncryptor encryptor; @Test public void encryptProperties() { // 需要加密的字符串 List<String> properties = new ArrayList<>(); properties.add("firstValue"); properties.add("secondValue"); for (String property : properties) { System.out.println(property + ":" + encryptor.encrypt(property)); } } }
3.得到步骤2完成加密后的密文,将密文用ENC()
包裹起来(形如ENC(密文)
),替换配置文件中的明文字符串
说明:
ENC(
和)
分别是jasypt默认的密文前缀和后缀,分别可以通过jasypt.encryptor.property.prefix
和jasypt.encryptor.property.suffix
修改默认的密文前缀、后缀;
只有jasypt.encryptor.password=MyEncryptPassword
一个配置是必须的,且实际运用中一般通过环境变量或项目参数注入,不写在配置文件中。
# jasypt配置
# 用户指定的加密口令,必填。实际运用中一般通过环境变量或项目参数注入
# jasypt.encryptor.password=MyEncryptPassword
# 修改密文前缀,非必须
# jasypt.encryptor.property.prefix=ENC(
# 修改密文后缀,非必须
# jasypt.encryptor.property.suffix=)
# 用密文替换明文字符串
my.test.key.first=ENC(riVj8PtdhOcX6sd8Peie2zzunc93u+bPOKc2Nrw8wr6DOHEj2hhHyculwLH6PoXc)
my.test.key.second=ENC(mdChittS38s+ehLRgM+KCw5Bze9LbdxVvddEGzwLYZ3bRjWC+0t5+prIt5GK6yyl)
4.使用
直接跟以前一样用@Value获取配置就行,无需做其它特殊配置。
以下是一个获取配置的示例:
package com.example.study.config; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import javax.annotation.PostConstruct; @Configuration public class MyPropertiesConfig { @Value("${my.test.key.first}") private String first; @Value("${my.test.key.second}") private String second; @PostConstruct public void printProperties() { System.out.println("first:" + first); System.out.println("second:" + second); } }
启动后,相关输出如下:
first:firstValue
second:secondValue
问题:
1.步骤2中对字符串加密时出现以下报错:
org.jasypt.exceptions.EncryptionOperationNotPossibleException: Encryption raised an exception. A possible cause is you are using strong encryption algorithms and you have not installed the Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files in this Java Virtual Machine
原因:
加密强度受限。我使用的是java 1.8.0_101
,可以通过在Oracle官网下载JCE,用来替换原本的jar包即可。
解决方法:
1.从Oracle下载JCE包(需要登陆):https://www.oracle.com/java/technologies/javase-jce8-downloads.html;
2.将下载的zip包解压,在里面能找到三个文件local_policy.jar
、US_export_policy.jar
、README.txt
;
3.用local_policy.jar
、US_export_policy.jar
替换掉%JAVA_HOME%\jre\lib\security\
中的local_policy.jar
、US_export_policy.jar
。
2.IDEA中如何注入jasypt配置?
1.打开IDEA右上角
Edit Run/Debug configurations
2.在左侧选中需要设置的应用后,在Program arguments
添加配置。如:----jasypt.encryptor.password=MyEncryptPassword
如图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。