【SpringBoot3】使用Jasypt加密数据库用户名、密码等敏感信息

一、使用步骤介绍

使用Jasypt(Java Simplified Encryption)进行数据加密和解密主要涉及几个步骤,包括引入依赖、配置加密密码、加密敏感信息、将加密信息存储到配置文件中,以及应用程序启动时自动解密。以下是详细的使用说明:

1. 引入依赖

首先,你需要在你的项目中引入Jasypt的依赖。如果你是使用Maven构建项目,可以在pom.xml文件中添加如下依赖(注意版本号可能随时间更新,请参考最新版本):

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

可根据需要替换成最新的版本号。

2. 配置加密密码

Jasypt需要一个密码来进行加密和解密操作。你可以通过以下几种方式配置这个密码:

  • 在配置文件中指定:在你的application.propertiesapplication.yml配置文件中,添加jasypt.encryptor.password配置项,并设置你的密码。例如:

    # application.properties
    jasypt.encryptor.password=your_encryption_password
    

    或者,在application.yml中:

    jasypt:encryptor:password: your_encryption_password
    

    然而,将密码直接写在配置文件中可能存在安全风险。因此,更推荐的做法是通过启动参数或环境变量来传递这个密码。

  • 通过启动参数指定:在启动应用程序时,可以通过-Djasypt.encryptor.password=your_encryption_password参数来指定加密密码。

  • 使用环境变量:在某些情况下,使用环境变量来存储敏感信息(如加密密码)可能更为安全。具体方法取决于你的应用程序部署环境。

3. 加密敏感信息

在配置加密密码后,你可以使用Jasypt提供的工具或API来加密你的敏感信息。加密后的信息将以密文形式存储。

  • 使用Jasypt CLI工具:Jasypt提供了一个命令行界面(CLI)工具,允许你在命令行中加密和解密字符串。你需要下载Jasypt的jar包,并在命令行中运行相应的命令。

  • 使用Jasypt API:在你的Java应用程序中,你可以通过注入StringEncryptor接口的实现类来编程方式加密和解密字符串。这通常在你的Spring Boot应用程序中通过自动装配完成。

4. 将加密信息存储到配置文件中

加密敏感信息后,你需要将这些加密后的信息存储到配置文件中。在Jasypt中,加密后的信息通常以ENC(...)的形式出现,括号内是加密后的密文。例如:

# application.properties
datasource.password=ENC(加密后的密码)

5. 应用程序启动时自动解密

当你的Spring Boot应用程序启动时,Jasypt会自动检测配置文件中的ENC(...)字符串,并使用你配置的加密密码来解密这些字符串。解密后的明文将用于应用程序的配置中。

注意事项

  • 安全性:确保你的加密密码足够复杂且安全存储,避免将密码直接写在配置文件中。
  • 版本兼容性:注意你使用的Jasypt版本与其他库或框架的兼容性。
  • 算法选择:Jasypt支持多种加密算法,你可以根据需要在配置文件中指定加密算法。

通过以上步骤,你可以在你的Spring Boot应用程序中使用Jasypt来加密和解密配置文件中的敏感信息。

二、使用示例代码

1、通过工具类生成密文

在application.properties 中增加配置,或者通过-Djasypt.encryptor.password=123456参数来指定加密密码

# 用于加密的密码
jasypt.encryptor.password=123456

使用 stringEncryptor.encrypt() 生成密文

public class JasyptSecretTest {@Autowiredprivate StringEncryptor stringEncryptor;@Value("${datasource.password}")private String password;@Testpublic void encrypt(){// 加密String encrypt = stringEncryptor.encrypt("root");System.out.println("encrypt = " + encrypt);}
}

2、在application.properties 中增加配置密文

# 加密后的密文,包裹在ENC() 中
datasource.password=ENC(grdksstYZMsPmwvA0ALHXpzBQN2YTyA3t4ow1PDfJzbl+UV0LdO8UlajWKeqUF7y)
# 用于加密的密码
jasypt.encryptor.password=123456

3、使用 @Value() 获取明文,也可以通过stringEncryptor.decrypt(encrypt)手动解密

@SpringBootTest
public class JasyptSecretTest {@Autowiredprivate StringEncryptor stringEncryptor;@Value("${datasource.password}")private String password;@Testpublic void encrypt(){// 加密String encrypt = stringEncryptor.encrypt("root");System.out.println("encrypt = " + encrypt);// 解密,输入获取的加密字符串进行解密String decrypt = stringEncryptor.decrypt(encrypt);System.out.println("decrypt = " + decrypt);}@Testpublic void show(){System.out.println("password = " + password);}
}

原理说明

SpringBoot项目在启动过程中,会自动注入beanStringEncryptor,用于根据不同的加密算法初始化不同的加解密实现类,通过StringEncryptorBuilder.build()初始化不同的加密算法

BeanNamePlaceholderRegistryPostProcessor

@Bean(name = ENCRYPTOR_BEAN_NAME)
public StringEncryptor stringEncryptor(final EnvCopy envCopy,final BeanFactory bf) {final String customEncryptorBeanName = envCopy.get().resolveRequiredPlaceholders(ENCRYPTOR_BEAN_PLACEHOLDER);final boolean isCustom = envCopy.get().containsProperty(ENCRYPTOR_BEAN_PROPERTY);return new DefaultLazyEncryptor(envCopy.get(), customEncryptorBeanName, isCustom, bf);
}

通过EncryptableMapPropertySourceWrapper重写了getProperty()方法,在获取配置值的时候,再做解密返回明文

DefaultPropertyResolver

@Override
public String resolvePropertyValue(String value) {return Optional.ofNullable(value).map(environment::resolvePlaceholders).filter(detector::isEncrypted).map(resolvedValue -> {try {// 获取密文String unwrappedProperty = detector.unwrapEncryptedValue(resolvedValue.trim());String resolvedProperty = environment.resolvePlaceholders(unwrappedProperty);// 执行解密操作return encryptor.decrypt(resolvedProperty);} catch (EncryptionOperationNotPossibleException e) {throw new DecryptionException("Unable to decrypt property: " + value + " resolved to: " + resolvedValue + ". Decryption of Properties failed,  make sure encryption/decryption " +"passwords match", e);}}).orElse(value);
}

三、Jasypt配置项

Jasypt支持多种配置参数以进行密码、Digest认证、文本和对象的加密。以下是Jasypt支持的一些常见配置参数:

配置参数描述示例
jasypt.encryptor.password加密器的密码,用于解密属性jasypt.encryptor.password=mySecretPassword
jasypt.encryptor.algorithm加密算法的名称jasypt.encryptor.algorithm=PBEWithMD5AndDES
jasypt.encryptor.keyObtentionIterations获取密钥时使用的迭代次数jasypt.encryptor.keyObtentionIterations=1000
jasypt.encryptor.poolSize加密池的大小(如果使用了池化加密器)jasypt.encryptor.poolSize=1
jasypt.encryptor.providerName加密提供者的名称(如JCE提供者)jasypt.encryptor.providerName=SunJCE
jasypt.encryptor.saltGeneratorClassName盐生成器的类名jasypt.encryptor.saltGeneratorClassName=org.jasypt.salt.RandomSaltGenerator
jasypt.encryptor.ivGeneratorClassName初始化向量生成器的类名jasypt.encryptor.ivGeneratorClassName=org.jasypt.iv.NoIvGenerator
jasypt.encryptor.stringOutputType加密字符串的输出类型(如base64)jasypt.encryptor.stringOutputType=base64
jasypt.encryptor.property.prefix加密属性前缀,用于识别加密属性jasypt.encryptor.property.prefix=ENC(
jasypt.encryptor.property.suffix加密属性后缀,用于识别加密属性jasypt.encryptor.property.suffix=)
jasypt.encryptor.proxyPropertySources是否通过代理截取属性值以进行解密jasypt.encryptor.proxyPropertySources=true

注意:

  • 这些参数主要用于配置Jasypt加密器(StringEncryptor)的行为。
  • 在实际使用中,特别是生产环境中,jasypt.encryptor.password等敏感信息不应该硬编码在配置文件中,而是通过环境变量、命令行参数或外部配置文件等方式安全地传递。
  • Jasypt支持多种加密算法,如PBEWithMD5AndDES、PBEWithHMACSHA512ANDAES_256等,具体选择哪种算法取决于安全需求和环境配置。
  • 上述表格中的示例配置参数值仅为演示用途,实际使用时需要根据项目需求和安全策略进行配置。

四、支持的加密算法

Jasypt支持多种加密算法以保护敏感数据。以下是Jasypt支持的一些常见加密算法:

加密算法名称描述
PBEWithMD5AndDES基于密码的加密(PBE),使用MD5作为散列函数和DES作为加密算法。这是一种较旧的加密算法,但在某些旧系统中可能仍在使用
PBEWithMD5AndTripleDES与PBEWithMD5AndDES类似,但使用TripleDES作为加密算法,提供了更强的安全性。
PBEWithHMACSHA512ANDAES_256使用HMAC-SHA-512散列函数和AES-256加密算法的组合,提供了非常高的安全性。这是Jasypt较新版本中推荐的加密算法之一(默认值)
AES高级加密标准(AES),是一种广泛使用的对称加密算法。Jasypt支持不同长度的AES密钥,如AES-128、AES-192和AES-256
RSARivest-Shamir-Adleman(RSA)算法,是一种非对称加密算法。它使用一对密钥:公钥和私钥。公钥用于加密数据,私钥用于解密数据

参考资料

  • https://github.com/ulisesbocchio/jasypt-spring-boot

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/40308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

11 docker安装redis

目录 安装redis 1. 配置redis配置文件redis.conf 1.1. 找到redis.conf文件 1.2. 配置文件 2. 启动容器 3. 测试redis-cli连接 4. 证明docker使用的是指定的配置文件 安装redis 1. 配置redis配置文件redis.conf 1.1. 找到redis.conf文件 宿主机创建目录/app/redis在/a…

WebXR:Web上的虚拟与增强现实技术

WebXR 是一种允许在网页上创建虚拟现实 (VR) 和增强现实 (AR) 体验的技术标准&#xff0c;它结合了WebVR和WebAR的概念&#xff0c;为开发者提供了一个统一的平台来开发跨平台的沉浸式Web应用。 WebXR 概述 什么是WebXR&#xff1f; WebXR API 旨在让浏览器成为VR和AR内容的平…

双非怎么进大厂?

https://www.nowcoder.com/share/jump/2764630231719583704126 大家好&#xff0c;我是白露啊。 今天我们要分享一个非常励志的故事&#xff0c;它证明了双非背景的毕业生也可以通过努力和坚持&#xff0c;进入梦想中的大厂。 下面是这位网友的真实经历&#xff0c;希望能为正…

泰安再见,泰山OFFICE还会再见

路过泰安&#xff0c;遇见彩虹。怀念和感恩在泰山信息科技的万丈豪情。 泰山OFFICE&#xff0c;还是要复活。

JavaScript Set新增7个方法操作集合

intersection() intersection () 它返回一个包含此集合和给定集合中所有元素的新集合。 const odds new Set([1, 3, 5, 7, 9]);const squares new Set([1, 4, 9]);console.log(odds.intersection(squares)); // Set(2) { 1, 9 }union() union () 它返回一个包含此集合中所有元…

提升Android Studio开发体验:使用Kelp插件实现颜色和图标预览

提升Android Studio开发体验&#xff1a;使用Kelp插件实现颜色和图标预览 在Android开发中&#xff0c;自动补全功能对于提高开发效率至关重要。然而&#xff0c;默认的Android Studio并不能预览颜色和图标&#xff0c;这使得开发者在选择资源时常常感到困惑。本文将介绍如何使…

【C语言小知识】备选拼写:iso646.h头文件

备选拼写&#xff1a;iso646.h头文件 C语言中有3种逻辑运算符&#xff1a; 逻辑运算符含义&&与||或!非 假设exp1和exp2是俩个简单的关系表达式&#xff0c;那么 当且仅当exp1和exp2都为真时&#xff0c;exp1 && exp2才为真。如果exp1或exp2为真&#xff0c;…

【学习笔记】Fréchet距离的 C 语言实现

Frchet 距离 Frchet 距离&#xff0c;又称为弗雷歇距离&#xff0c;是一种衡量两条曲线&#xff08;或两个路径&#xff09;之间相似性的度量方法。这个概念最初在度量空间理论中被定义&#xff0c;后来被广泛应用于计算机科学、地理信息系统、图像处理、生物信息学等多个领域…

使用Python实现深度学习模型:迁移学习与领域自适应教程

引言 迁移学习和领域自适应是深度学习中的两个重要概念。迁移学习旨在将已在某个任务上训练好的模型应用于新的任务&#xff0c;而领域自适应则是调整模型以适应不同的数据分布。本文将通过一个详细的教程&#xff0c;介绍如何使用Python实现迁移学习和领域自适应。 环境准备…

Visual Studio常见问题

VS的文件路径为什么要用双斜杠(\)? 答:在编程时,写入文件的路径如image = cvLoadImage("C:\Users\lyb\Documents),这种写法在编译时不会报错,但在运行时会报错,报错图像读入为空,这是因为Windows的路径虽然用的是单斜杠,但在编程时的意义是不同的,单斜杠“\”…

Go语言中的可变参数:灵活而强大的函数参数

Go语言中的可变参数:灵活而强大的函数参数 在Go语言中,可变参数是一种非常有用的特性,它允许函数接受任意数量的参数。这种灵活性使得函数可以更加通用和可复用。本文将深入探讨Go语言中可变参数的用法、原理和最佳实践。 什么是可变参数? 可变参数允许你传递零个或多个值给…

LNMP架构搭建Discuz论坛

LNMP架构是一种用于搭建Web服务器环境的常用架构&#xff0c;由Linux、Nginx、MySQL和PHP组成 组成功能Linux作为操作系统的基础&#xff0c;提供稳定的环境Nginx作为反向代理服务器&#xff0c;处理客户端的请求并将他们转发给后端的应用服务器MySQL作为关系型数据库管理系统…

7.2 数据结构

作业 #include <stdio.h> #include <string.h> #include <stdlib.h> struct student {char name[32];int age;double score; }s[3];void stu_input(struct student *s,int n) {printf("请输入%d个学生的信息&#xff08;姓名&#xff0c;年龄&#xff0…

【服装识别系统】图像识别+Python+人工智能+深度学习+算法模型+TensorFlow

一、介绍 服装识别系统&#xff0c;本系统作为图像识别方面的一个典型应用&#xff0c;使用Python作为主要编程语言&#xff0c;并通过TensorFlow搭建ResNet50卷积神经算法网络模型&#xff0c;通过对18种不同的服装&#xff08;‘黑色连衣裙’, ‘黑色衬衫’, ‘黑色鞋子’, …

Python机器学习实战:利用决策树算法预测鸢尾花种类

引言 在人工智能领域&#xff0c;机器学习作为一种强大的工具正在改变我们对数据的认知和处理方式。Python因其丰富的机器学习库和直观易用的特性&#xff0c;成为了众多开发者首选的语言。本篇文章将带领大家深入了解如何运用Python中的scikit-learn库来构建决策树模型&#…

关系型数据库和矢量数据库分别适用于哪些领域?

关系型数据库和矢量数据库分别适用于哪些领域&#xff1f; 李升伟 关系型数据库适用于以下领域&#xff1a; 1. 金融行业&#xff1a;如银行的交易处理、账户管理等&#xff0c;对数据的一致性和事务处理要求极高。 2. 企业资源规划&#xff08;ERP&#xff09;&#xff1a…

Meta 发布 Meta 3D Gen 文本生成3D模型

Meta推出了 Meta 3D Gen &#xff08;3DGen&#xff09;&#xff0c;这是一种用于文本到 3D 资产生成的最先进的快速管道。3DGen 可在一分钟内提供具有高提示保真度和高质量 3D 形状和纹理的 3D 资产创建。 它支持基于物理的渲染 &#xff08;PBR&#xff09;&#xff0c;这是…

网口串口(Serialport)服务器

文章所用工具http://t.csdnimg.cn/2gIR8http://t.csdnimg.cn/2gIR8 搭建服务器界面 操作配置文件保存方式类 public string FileName { get; set; }public IniHelper(string name) {this.FileName name; //在构造函数中给路径赋值} 1 先导入c语言进行读取操作ini文件的方法 …

Python基于you-get下载网页上的视频

​ 1.python 下载地址 下载 : https://www.python.org/downloads/ 2. 配置环境变量 配置 python_home 地址 配置 python_scripts 地址 在path 中加入对应配置 3. 验证 ​ C:\Users>python --version Python 3.12.4C:\Users>wheel version wheel 0.43.04. 下载 c…