随笔 - 256  文章 - 2  评论 - 18  阅读 - 123万

SpringBoot集成jasypt,加密yml配置文件

一、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.Driver
yml配置
复制代码

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.jar
Linux 系统环境变量配置
复制代码

方式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

posted on   腾逸  阅读(2928)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 我与微信审核的“相爱相杀”看个人小程序副业
· DeepSeek “源神”启动!「GitHub 热点速览」
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
历史上的今天:
2019-04-09 org.hibernate.type.SerializationException: could not deserialize 反序列化失败
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

点击右上角即可分享
微信分享提示