爱码网专注于资源免费下载

Spring Boot + Jasypt 实现敏感配置属性加密

前言

在Spring Boot项目中,应该会用到很多的配置属性,这些属性中难免会有敏感信息,比如数据库账号、密码、域名、redis密码等等。为了安全起见,可以结合Jasypt这个库,对敏感属性实现加密处理。

引入的依赖

这里笔者的环境是spring boot 2.1.7,引用的Jasypt版本为3.0.2,具体如下:

<dependency>
        <groupId>com.github.ulisesbocchio</groupId>
        <artifactId>jasypt-spring-boot-starter</artifactId>
        <version>3.0.2</version>
</dependency>

如何加密

首先,添加Jasypt的专属配置属性,最基本也是最需要的一个属性password,告诉Jasypt一个“盐值”吧,它会根据提供的盐值,按照指定的加密算法,对敏感配置属性进行加密解密。除了指定盐值,Jasypt还提供了更多属性,可以指定加密算法等等。具体可以参照Jasypt在Github上的Readme。

那么告诉Jasypt盐值后,怎样来对自己的敏感配置进行加密呢?目前笔者知道有这么2种方式。

Maven插件

Jasypt提供了一个Maven插件,最基本的功能就是可以用这个插件对敏感属性值进行加密。当然这个插件还有其他更强的功能,可以自行深入研究。

pom.xml中添加该插件:

<plugin>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-maven-plugin</artifactId>
    <version>3.0.2</version>
</plugin>


执行下面的命令,对敏感属性值进行加密。

mvn jasypt:encrypt-value -Djasypt.encryptor.password="#$!_" -Djasypt.encryptor.algorithm="PBEWithMD5AndDES" -Djasypt.plugin.value="test"
  • jasypt.encryptor.password,告诉Jasypt你提供的盐值。

  • jasypt.encryptor.algorithm,告诉Jasypt用哪个算法加密。

  • jasypt.plugin.value,告诉Jasypt加密的值什么。

测试类

这种方式是自己手写一个测试类,在这个测试类中用测试代码的方式执行加密处理,输出加密结果。因为用的是jasypt-spring-boot-starter,默认它会提供一个StringEncryptor来做加解密处理。可以利用StringEncryptor来加密敏感配置属性。

需要添加配置属性,让测试代码运行时能够“感知”到。

jasypt.encryptor.password=#$!_
#根据需要指定合适的加密算法,不指定会采用默认算法
#jasypt.encryptor.algorithm=PBEWithMD5AndDES

测试代码示例如下:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class EncryptTest {
    @Autowired
    private StringEncryptor stringEncryptor;

    @Test
    public void encrypt() {
        String encryptStr = stringEncryptor.encrypt("localhost:3306");

        System.out.println(encryptStr);

        encryptStr = stringEncryptor.encrypt("mysql_account");

        System.out.println(encryptStr);

        encryptStr = stringEncryptor.encrypt("mysql_password");

        System.out.println(encryptStr);
    }
}

如何解密

加密后的属性值,按照要求格式进行替换,比如把原先的redis密码属性修改如下:

spring.redis.password=ENC(ACjcb1s5O0g+yaxSrktQIK3qTTrpwhVojaYDM23pClE=)

ENC(...)是Jasypt解密时的标识,里面放的是加密后的值,Jasypt见到这个标识后会里面的加密值进行解密处理。当然这个ENC(...)标识是支持自定义的,具体看最后的参考链接。

解密之前,还需要告诉Jasypt,加密时使用的盐值和加密算法。所以不要忘了上面提到的这两个属性。

jasypt.encryptor.password=#$!_
#根据需要指定合适的加密算法,不指定会采用默认算法
#jasypt.encryptor.algorithm=PBEWithMD5AndDES

遇见的异常

由于笔者用的Jasypt版本是3.0.2,如果你用的也是一样的话,那么使用上述的加密、解密方式,你应该会遇到下面的异常。大概意思是你需要在你本地JDK里安装JCE。

因为Jasypt的2.x版本,jasypt.encryptor.algorithm默认值为PBEWithMD5AndDES,而3.x版本中,该属性的默认值为PBEWITHHMACSHA512ANDAES_256。

那么你可以安装JCE,或者指定jasypt.encryptor.algorithm值为PBEWithMD5AndDES。

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

	at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.handleInvalidKeyException(StandardPBEByteEncryptor.java:1207)
	at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.encrypt(StandardPBEByteEncryptor.java:996)
	at org.jasypt.encryption.pbe.StandardPBEStringEncryptor.encrypt(StandardPBEStringEncryptor.java:655)
	at org.jasypt.encryption.pbe.PooledPBEStringEncryptor.encrypt(PooledPBEStringEncryptor.java:465)
	at com.ulisesbocchio.jasyptspringboot.encryptor.DefaultLazyEncryptor.encrypt(DefaultLazyEncryptor.java:110)

更进一步的安全思考

基本上Jasypt加解密就简单描述完毕了,其实Jasypt就是依赖提供的盐值及指定的算法来进行加解密的。假设这个盐值被暴露了,那么所谓的加密也是不安全的。

笔者目前有2种思路来更进一步的提升加密安全。Jasypt加解密所依赖的属性值,应该避免直接在属性文件中暴露,可以选择配置到环境变量中,或者配置到命令行的参数中。

Linux中配置环境变量

具体如何在Linux系统中配置环境变量,可以参考这里

Spring Boot应用配置启动参数

笔者用的是Spring Boot Maven插件打包出的可运行jar包,在线上环境中可以轻松地配置为服务,在对应的.conf文件中添加启动参数,参考如下:

RUN_ARGS="--jasypt.encryptor.password=&$!_ --jasypt.encryptor.algorithm=PBEWithMD5AndDES"

具体笔者部署Spring Boot应用的方式,可看这里学习。

待研究的一个现象

笔者采用如下的Jasypt属性配置,对“123456”分别进行了两次加密输出,得到的值是不一样的。

jasypt.encryptor.password=#$!_
#根据需要指定合适的加密算法,不指定会采用默认算法
jasypt.encryptor.algorithm=PBEWithMD5AndDES

两次加密的结果,分别是:

I3H2AZaME7KgI5d0JHWR/27MN1WFRsJd

vCuFGjOUzWYYgIiNniuH2HxC7h2EB7BW

拿这两次的结果分别去解密,结果是否都是“123456”呢?亲测,是的!


Spring Boot + Jasypt 实现敏感配置属性加密-第1张图片



来源:https://juejin.cn/post/6844904162648391693

本文链接:https://www.icode1024.com/article/174.html

网友评论