SpringBoot 使用Jasypt加密配置

简介: SpringBoot 使用Jasypt加密配置

在Spring项目中,配置文件的内容默认都是明文的,但是对于敏感的信息,如数据库密码、密匙等,直接使用明文存在安全隐患。可以通过Jasypt工具包进行加解密。

在SpringBoot中引入Jasypt

jasypt版本和springBoot版本之间的对应关系如下:

  • SpringBoot2.1.x 对应使用 jasypt2.10
  • SpringBoot1.5.x 对应使用 jasypt1.5
<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>3.0.3</version>
</dependency>

编写Jasypt加密工具类

/**
 * Jasypt 加密工具
 *
 * @author likai
 * @Date 2022/2/14 17:59
 */
public class JasyptUtil {

    private static final String PERIANTHS512ANODES_256 = "PBEWITHHMACSHA512ANDAES_256";

    /**
     * Jasypt加密
     *
     * @param plainText 待加密的原文
     * @return String
     */
    public static String encryptWithSHA512(String plainText, String secret) {
        // 1. 获取解密工具实例
        PooledPBEStringEncryptor encryptor = getPooledPBEStringEncryptor(secret);
        // 2. 加密
        return encryptor.encrypt(plainText);
    }

    /**
     * Jasypt解密
     *
     * @param encryptedText 待解密密文
     * @param secret        解密秘钥
     * @return String
     */
    public static String decryptWithSHA512(String encryptedText, String secret) {
        // 1. 获取解密工具实例
        PooledPBEStringEncryptor encryptor = getPooledPBEStringEncryptor(secret);
        // 2. 解密
        return encryptor.decrypt(encryptedText);
    }

    /**
     * 获取解密工具实例
     *
     * @return PooledPBEStringEncryptor
     */
    private static PooledPBEStringEncryptor getPooledPBEStringEncryptor(String secret) {
         // 1. 创建加解密工具实例
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        // 2. 加解密配置
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(secret);
        config.setAlgorithm(PERIANTHS512ANODES_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;
    }
}

配置文件

#port
server.port=8088
#要加密配置
datasource.password=lkstarblog.top
#加密使用的盐值
jasypt.encryptor.password=lkstarblog

编写测试类

@Slf4j
@SpringBootTest(classes = EncryptApplication.class)
public class EncryptApplicationTest {

    /**
     * 配置中读取的密码
     */
    @Value("${datasource.password}")
    private String password;

    /**
     *  加密用的盐值
     */
    @Value("${jasypt.encryptor.password}")
    private String salt;

    /**
     * 数据加密
     */
    @Test
    public void testEncrypt(){
        log.info("原始数据:"+password);
        String encrypt = JasyptUtil.encryptWithSHA512(password, salt);
        log.info("加密后的数据"+encrypt);
        String decrypt = JasyptUtil.decryptWithSHA512(encrypt, salt);
        log.info("解密后的数据"+decrypt);
    }
}

运行测试类观察打印的日志:

2022-02-15 16:12:25.541  INFO 16836 --- [           main] com.lk.star.EncryptApplicationTest       : 原始数据:lkstarblog.top
2022-02-15 16:12:26.283  INFO 16836 --- [           main] com.lk.star.EncryptApplicationTest       : 加密后的数据2lt6tLTs+PE20zYo2YzLdWbTg1IP/HQEKVoeFOLtvHQQbaUHwuILNkl6KlFcXb8R
2022-02-15 16:12:26.291  INFO 16836 --- [           main] com.lk.star.EncryptApplicationTest       : 解密后的数据lkstarblog.top

配置文件解密读取

将加密得到的密文,加上 ENC() 特殊标记,写入的配置文件。

#port
server.port=8088
#要加密配置
#datasource.password=lkstarblog.top
datasource.password=ENC(2lt6tLTs+PE20zYo2YzLdWbTg1IP/HQEKVoeFOLtvHQQbaUHwuILNkl6KlFcXb8R)
#加密使用的盐值
jasypt.encryptor.password=lkstarblog

编写测试类,看获取到的配置是否正确

   /**
     * 读取加密后的配置
     * */
    @Test
    public void testDecrypt(){
        log.info("datasource.password:"+password);
    }

查看控制台打印日志

2022-02-15 16:17:06.669  INFO 12372 --- [           main] com.lk.star.EncryptApplicationTest       : datasource.password:lkstarblog.top

加密密匙的配置

主要有如下两种方式处理加密密匙:

  • 直接写入到SpringBoot的配置文件中
  • 在启动命令中加入密钥

测试代码是写在配置文件中的,这样的作法并不安全。

在启动命令后配置上加密密匙

java -jar -Djasypt.encryptor.password=MySecret xxx.jar

相关文章
|
5月前
|
Java Spring
Spring Boot配置的优先级?
在Spring Boot项目中,配置可通过配置文件和外部配置实现。支持的配置文件包括application.properties、application.yml和application.yaml,优先级依次降低。外部配置常用方式有Java系统属性(如-Dserver.port=9001)和命令行参数(如--server.port=10010),其中命令行参数优先级高于系统属性。整体优先级顺序为:命令行参数 &gt; Java系统属性 &gt; application.properties &gt; application.yml &gt; application.yaml。
1003 0
|
2月前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
333 3
|
3月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
625 5
|
3月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
204 0
探索Spring Boot的@Conditional注解的上下文配置
|
4月前
|
安全 算法 Java
在Spring Boot中应用Jasypt以加密配置信息。
通过以上步骤,可以在Spring Boot应用中有效地利用Jasypt对配置信息进行加密,这样即使配置文件被泄露,其中的敏感信息也不会直接暴露给攻击者。这是一种在不牺牲操作复杂度的情况下提升应用安全性的简便方法。
1054 10
|
2月前
|
JavaScript Java 关系型数据库
基于springboot的项目管理系统
本文探讨项目管理系统在现代企业中的应用与实现,分析其研究背景、意义及现状,阐述基于SSM、Java、MySQL和Vue等技术构建系统的关键方法,展现其在提升管理效率、协同水平与风险管控方面的价值。
|
2月前
|
搜索推荐 JavaScript Java
基于springboot的儿童家长教育能力提升学习系统
本系统聚焦儿童家长教育能力提升,针对家庭教育中理念混乱、时间不足、个性化服务缺失等问题,构建科学、系统、个性化的在线学习平台。融合Spring Boot、Vue等先进技术,整合优质教育资源,提供高效便捷的学习路径,助力家长掌握科学育儿方法,促进儿童全面健康发展,推动家庭和谐与社会进步。
|
2月前
|
JavaScript Java 关系型数据库
基于springboot的古树名木保护管理系统
本研究针对古树保护面临的严峻挑战,构建基于Java、Vue、MySQL与Spring Boot技术的信息化管理系统,实现古树资源的动态监测、数据管理与科学保护,推动生态、文化与经济可持续发展。
|
2月前
|
监控 安全 JavaScript
2025基于springboot的校车预定全流程管理系统
针对传统校车管理效率低、信息不透明等问题,本研究设计并实现了一套校车预定全流程管理系统。系统采用Spring Boot、Java、Vue和MySQL等技术,实现校车信息管理、在线预定、实时监控等功能,提升学校管理效率,保障学生出行安全,推动教育信息化发展。