【Jasypt】Spring Boot 配置文件加解密 Jasypt 配置文件加密

news/2024/11/17 0:22:42/

Spring Boot 配置文件加解密

  • 一、Jasypt简介
  • 二、集成方法
    • 2.1 方式一
    • 2.2 方式二
    • 2.3 方式三
  • 三、Springboot整合Jasypt实战
    • 3.1 引入依赖
    • 3.2 编写配置类,配置相关信息
    • 3.3 使用Jasypt对数据库密码加密,并替换明文
    • 3.4 查看执行结果
  • 四、拓展
    • 4.1 关于加解密秘钥如何存储
    • 4.2 使用jasypt3.0启动时报
      • 4.2.1 解决方案1,降低版本
      • 4.2.2 解决方案2,修改算法

一、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)对同一个内容执行加密,每次生成的密文都是不一样的,但是根据根据这些密文解密成原内容都是可以的.

4、Jasypt 官方使用文档:http://www.jasypt.org/
GitHub地址:https://github.com/ulisesbocchio/jasypt-spring-boot。

二、集成方法

官网上推荐的集成到SpringBoot项目中,有3种方法分别是:

  • 如果使用@SpringBootApplication或@EnableAutoConfiguration,则仅需要添加jasypt-spring-boot-starter启动器jar到您的类路径中即可,它自动会在整个 Spring 环境中启用可加密属性。
  • 添加jasypt-spring-boot到您的类路径并添加@EnableEncryptableProperties到您的主配置类以在整个 Spring 环境中启用可加密属性。
  • 添加jasypt-spring-boot到您的类路径并使用@EncrytablePropertySource注解声明单独的可加密属性源。

2.1 方式一

在Springboot应用程序中,如果使用了@SpringBootApplication or @EnableAutoConfiguration注解,则可以直接在pom文件中添加jasypt-spring-boot依赖,然后就可以在整个Spring环境中使用jasypt对属性进行加解密操作(属性包括:系统属性、环境属性、命令行参数、application.properties、application-*.properties、yml属性以及任何其他属性源)。

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

2.2 方式二

如果项目中没有使用到@SpringBootApplication or @EnableAutoConfiguration 自动配置注解,则可以通过以下两个步骤完成对Jasypt的集成。

步骤一:pom文件引入jasypt依赖

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

步骤二:在配置类中,添加@EnableEncryptableProperties注解,示例如下:

@Configuration
@EnableEncryptableProperties
public class MyApplication {...
}

通过这种方式,你的项目一样可以集成Jasypt,并且可加密属性也可以在整个Spring环境中启用属性包括:系统属性、环境属性、命令行参数、application.properties、application-*.properties、yml属性以及任何其他属性源)。

2.3 方式三

如果项目中没有使用到@SpringBootApplication or @EnableAutoConfiguration 自动配置注解,又不想在整个Spring环境中启用加密的属性,则可以使用该种方式,具体步骤如下:

步骤一:pom文件引入jasypt依赖

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

步骤二、在配置类中,使用@EncryptablePropertySource注解添加任意数量想要生效加密属性的配置文件路径,与Spring中@PropertySource注解的使用类似,示例如下:

@Configuration
@EncryptablePropertySource(name = "EncryptedProperties", value = "classpath:encrypted.properties")
public class MyApplication {...
}

同时,还可以使用@EncryptablePropertySources 注解对@EncryptablePropertySource配置进行分组,示例如下:

@Configuration
@EncryptablePropertySources({@EncryptablePropertySource("classpath:encrypted.properties"),@EncryptablePropertySource("classpath:encrypted2.properties")})
public class MyApplication {...
}

说明:从Jasypt 1.8版本开始,@EncryptablePropertySource注解支持配置YAML文件。

三、Springboot整合Jasypt实战

3.1 引入依赖

说明,本项目使用技术栈是 spring-boot+jasypt,故使用上面介绍的第一种方式来在项目中集成Jasypt,文章中只截取部分核心代码。

3.2 编写配置类,配置相关信息

@Configuration
@EableEncryptableProperties
public class JasyptConfiguration() {@Bean("jasyptStringEncryptor")public StringEncryptor stringEncryptor() {PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();SimpleStringPBEConfig config = new SimpleStringPBEConfig();config.setPassword("password");config.setAlgorithm("PBEWITHHMACSHA512ANDAES_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;}
}

3.3 使用Jasypt对数据库密码加密,并替换明文

注意:每次运行都会生成不同的密文,所以你运行之后的结果肯定会跟我运行的结果不同。

在这里插入图片描述
在这里插入图片描述

3.4 查看执行结果

在这里插入图片描述

四、拓展

4.1 关于加解密秘钥如何存储

如果秘钥写在代码或者配置文件,一旦代码泄露,那别人就可以使用秘钥解密我们的密文,这样对敏感信息加密的作用就不存在了,因此,秘钥不能以明文形式存储在代码或者配置文件中,下面就介绍一些安全的存储秘钥的形式。

方式1、把秘钥当做程序启动时环境变量(推荐),示例如下:

java  -Djasypt.encryptor.password=秘钥 -jar xxx.jar

方式2、把秘钥当做程序启动时的命令行参数(推荐),示例如下:

java -jar xxx.jar --jasypt.encryptor.password=秘钥

方式3、自定义加密、解密器逻辑

这里不再展开,有需要可自行编写自定义加密和解密器的逻辑代码。

4.2 使用jasypt3.0启动时报

使用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无限强度权限策略文件)支持,否则运行会出现错误。

4.2.1 解决方案1,降低版本

降低jasypt的版本 - 使用2.x的版本

4.2.2 解决方案2,修改算法

将加密算法替换成PBEWithMD5AndDES 算法,并配置iv-generator-classname: 为org.jasypt.iv.NoIvGenerator值
在这里插入图片描述

本文完结!


http://www.ppmy.cn/news/84033.html

相关文章

java基础入门-14-【集合(泛型Set数据结构)】

Java基础入门-14-【集合(泛型&Set&数据结构)】 23、集合(泛型&Set&数据结构)1.泛型1.1 泛型概述1.2 泛型的好处1.3 泛型的细节1.4 代码案例1.5 泛型可以在很多地方进行定义1.6 泛型类1.7 泛型类的书写1.8 泛型方法1.9 泛型方法的练习1.10 泛型接口1.11 泛型…

图解LeetCode——138. 复制带随机指针的链表

一、题目 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值。…

从HelloWorld深入源码了解SpringSecurity底层逻辑

文章目录 一、环境搭建1、创建项目测试1.1、搭建基础项目1.2、整合Spring Security 二、实现原理1、Spring Security的实现原理1.1、Spring Security 如何完成认证和授权1.2、Security Filters 2、 Spring Security默认配置和如何自定义配置 三、整个HelloWorld的流程分析三、H…

为什么要用微服务的分布式架构呢?关于传统架构的分布式集群的猜想!

前提概要&#xff1a; 1、个人对微服务研究不太深入&#xff0c;有些看法可能不太正确。 2、本人很多项目其实都是传统的非微服务架构&#xff0c;而且大部分项目单机硬件&#xff0c;或者云服务器已经能够很好支持。未来三五年内可能都不需要升级扩展。 3、本人很多项目公司规…

解决方案 TestCenter自动测试软件平台

方案概述 TestCenter是一个专为加速您的测试系统软件开发而设计的自动测试系统软件平台&#xff0c;主要应用于测试程序的开发、运行和管理。TestCenter实现了对测试资源管理、测试程序开发与调试、测试数据管理以及测试程序发布等功能的无缝集成和统一部署&#xff0c;这将帮…

打家劫舍 III——力扣337

文章目录 题目描述法一&#xff1a;动态规划 题目描述 法一&#xff1a;动态规划 问题简化&#xff1a;一棵二叉树&#xff0c;树上的每个点都有对应的权值&#xff0c;每个点有两种状态&#xff08;选中和不选中&#xff09;&#xff0c;问在不能同时选中有父子关系的点的情况…

QSocketNotifier:套接字通知程序不能从另一个线程启用或禁用

本文介绍了QSocketNotifier:套接字通知程序不能从另一个线程启用或禁用的处理方法&#xff0c;对大家解决问题具有一定的参考价值&#xff0c;需要的朋友们下面随着小编来一起学习吧&#xff01; 问题描述 限时送ChatGPT账号.. 我尝试构建一个使用QT的多线程游戏服务器&…

【拼多多API 开发系列】百亿补贴商品详情接口,代码封装

为了进行电商平台 PDD 的API开发&#xff0c;首先我们需要做下面几件事情。 1&#xff09;开发者注册一个账号 2&#xff09;然后为每个 PDD 应用注册一个应用程序键&#xff08;App Key) 。 3&#xff09;下载 PDD API的SDK并掌握基本的API基础知识和调用 4&#xff09;利用SD…