首页 > 其他分享 >SpringBoot集成jasypt,加密yml配置文件

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

时间:2024-04-09 10:35:39浏览次数:24  
标签:加密 SpringBoot 配置文件 jasypt org import password config

一、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

标签:加密,SpringBoot,配置文件,jasypt,org,import,password,config
From: https://www.cnblogs.com/zt007/p/18123319

相关文章

  • springboot本地打war包
    1、pom.xml修改图里标注的①②,新增③,图片下面有我打包的pom.xml大家可以参考<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:s......
  • 基于SpringBoot+MySQL+SSM+Vue.js的生鲜在线销售系统(附论文)
    演示视频基于SpringBoot+MySQL+SSM+Vue.js的生鲜在线销售系统技术描述开发工具:Idea/Eclipse数据库:MySQLJar包仓库:Maven前端框架:Vue/ElementUI后端框架:Spring+SpringMVC+Mybatis+SpringBoot文字描述基于SpringBoot+MySQL+SSM+Vue.js的生鲜在线销售系统(附......
  • 基于SpringBoot+MySQL+SSM+Vue.js的招聘系统(附论文)
    演示视频基于SpringBoot+MySQL+SSM+Vue.js的招聘系统技术描述开发工具:Idea/Eclipse数据库:MySQLJar包仓库:Maven前端框架:Vue/ElementUI后端框架:Spring+SpringMVC+Mybatis+SpringBoot文字描述基于SpringBoot+MySQL+SSM+Vue.js的招聘系统(附论文),用户,管理员......
  • java计算机毕业设计房地产公司员工工单管理系统(附源码+springboot+开题+论文+部署)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着房地产行业的迅猛发展,企业内部的运营和管理面临着越来越高的要求。特别是在员工工单管理方面,传统的纸质工单或简单的电子记录方式已经无法满足企......
  • java计算机毕业设计房产中介管理(附源码+springboot+开题+论文+部署)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在当前的房地产市场环境下,房产中介作为连接买卖双方的重要桥梁,其运营效率和服务质量直接影响到市场的健康发展和客户的满意度。然而,传统的房产中介管......
  • 【SpringBoot + Tomcat】请求到达后端服务进程后的处理过程
    1 前言这节我主要是想看下,Tomcat如何接收到请求并且是怎么一步步封装并交给SpringMVC处理的。这块之前一直没太深入的了解过,所以这节我们来看看。在看这节之前,你首先要清楚这两个问题,方便你更好的去理解。(1)SpringBoot启动的过程中,Tomcat的创建和启动时机是在什么时候呢?不......
  • SpringBoot通过token实现用户互踢功能
    认识token所谓token,既用户能够在一定时间内证明自己身份的一长串字符串。正常的使用流程为:用户第一次登入——》服务器为该用户签发一份token——》进行其他服务请求时携带上token——》服务器判断此token在有效期内——》放行此次请求。在上述过程中,用户只有在请求特定的接......
  • SpringBoot中定义Filter的三种方式
    第一种方式@ConfigurationpublicclassFilterConfig{@BeanpublicFilterRegistrationBean<LogFilter>paramsFilter(){FilterRegistrationBean<LogFilter>registration=newFilterRegistrationBean();registration.setFilter(new......
  • 校园台球厅人员与设备管理系统的设计与实现|SpringBoot+ Mysql+Java+ B/S结构(可运行
    本项目包含可运行源码+数据库+LW,文末可获取本项目的所有资料。推荐阅读300套最新项目持续更新中.....最新ssm+java项目文档+视频演示+可运行源码分享最新jsp+java项目文档+视频演示+可运行源码分享最新SpringBoot项目文档+视频演示+可运行源码分享2024年56套包含java,ssm......
  • 使用腾讯云Kubernetes部署SpringBoot项目
    使用流程创建集群创建Serverless类型的kubernetes集群(更加简单),不需要集群管理费用,但创建容器还是收费的。创建容器要确保当前账号有充足的余额在创建过程中,主要选择镜像,可以从自己的镜像仓库(需要先将自己的SpringBoot项目创建docker镜像并推送到远程仓库),或者Docker公共......