Spring Boot配置文件中的配置项加密&jasypt使用

在Spring Boot中,有很多口令需要加密,如数据库连接密码、访问第三方接口的Token等。常见的方法就是用jasypt对口令进行加密。

实际上,jasypt可以对配置文件中任意配置项的值进行加密,不局限于对密码的加密。


1.在pom.xml中添加jasypt相关依赖

xml 复制代码
        <!-- 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-starterpom.xml文件,再查看其parent的pom.xml文件,找到jasypt.version的值,才能知道jasypt-x.x.x.jar的具体版本。

所以,直接在Spring Boot中注入用于字符串加密的Bean,然后调用加密方法对字符串加密。加密完成后,加密的代码就不再需要了(后续如果还有加密需求,重新用下面代码加密一遍即可)。

加密代码:

java 复制代码
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.prefixjasypt.encryptor.property.suffix修改默认的密文前缀、后缀;

  • 只有jasypt.encryptor.password=MyEncryptPassword一个配置是必须的,且实际运用中一般通过环境变量或项目参数注入,不写在配置文件中。

properties 复制代码
# 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获取配置就行,无需做其它特殊配置。

以下是一个获取配置的示例:

java 复制代码
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.jarUS_export_policy.jarREADME.txt

3.用local_policy.jarUS_export_policy.jar替换掉%JAVA_HOME%\jre\lib\security\中的local_policy.jarUS_export_policy.jar

2.IDEA中如何注入jasypt配置?

1.打开IDEA右上角Edit Run/Debug configurations

2.在左侧选中需要设置的应用后,在Program arguments添加配置。如:----jasypt.encryptor.password=MyEncryptPassword

如图:

相关推荐
Theodore_10222 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
冰帝海岸3 小时前
01-spring security认证笔记
java·笔记·spring
世间万物皆对象4 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
没书读了4 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
小二·4 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic5 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
懒洋洋大魔王5 小时前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康5 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
qq_17448285755 小时前
springboot基于微信小程序的旧衣回收系统的设计与实现
spring boot·后端·微信小程序
转世成为计算机大神5 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式