博客
关于我
SpringBoot 使用 jasypt 对配置项进行加密
阅读量:796 次
发布时间:2023-03-22

本文共 4070 字,大约阅读时间需要 13 分钟。

Jasypt 在 Spring Boot 项目中的加密配置实践

在软件开发中,数据安全性一直是核心关注点。尤其是在配置管理方面,如何保护敏感信息而不影响系统运行,成为开发者面临的重要挑战。Jasypt(Java Simplified YAML Properties)等工具为我们提供了一种灵活且高效的解决方案。以下将详细介绍如何在 Spring Boot 项目中使用 Jasypt 来加密配置,并分享实际应用中的经验总结。

1. 引入依赖

首先,我们需要将 Jasypt 的相关依赖引入到项目中。以下是 Maven 项目中配置的示例:

com.github.ulisesbocchio
jasypt-spring-boot-starter
3.0.3

2. 生成加密字符串

Jasypt 提供了三种主要方式来生成加密字符串,每种方式都有其适用的场景。

2.1 通过 API 获取

可以通过编写简单的 Java 类来调用 Jasypt 的 API 来实现加密。以下是一个典型的实现示例:

public class EncryptionUtil {
private static final BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
public static String encrypt(String plaintext) {
textEncryptor.setPassword("ADUMDFUOV7834*");
return textEncryptor.encrypt(plaintext);
}
}

调用方法如下:

String encryptedUsername = EncryptionUtil.encrypt("test");
String encryptedPassword = EncryptionUtil.encrypt("123");

输出示例:

username: yB0xTBF7SimOMLKlD7b3WA==
password: NTT9dRodj5y6o+Ppq1rFsQ==

2.2 执行 JAR 命令

如果你不想在代码中直接使用 API,可以使用命令行工具来实现加密。以下是执行 JAR 的命令示例:

java -cp ./jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI \
-password="ADUMDFUOV7834*" \
-algorithm=PBEWithMD5AndDES \
input=test

输出示例:

----ENVIRONMENT-----------------
Runtime: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 25.231-b11
----
ARGUMENTS-------------------
input: test
algorithm: PBEWithMD5AndDES
password: ADUMDFUOV7834*
----
OUTPUT----------------------
y7lANzmle3mXD2aiComkww==

需要注意的是,使用命令行工具加密的结果与 API 获取的结果有一些差异,但无论哪种方式,解密时都需要提供相同的密钥才能恢复原始数据。

2.3 Maven 插件方式

在 Maven 项目中,可以通过配置插件来实现自动化加密。以下是一个典型的 Maven 配置示例:

com.github.ulisesbocchio
jasypt-maven-plugin
3.0.3
src/main/resources/application.yml

application.yml 文件中,使用 DEC() 标签包裹需要加密的配置项,例如:

spring:
datasource:
username: DEC(test)
password: DEC(123456)
redis:
password: DEC(123)

执行命令:

mvn jasypt:encrypt -Djasypt.encryptor.password="ADUMDFUOV7834*"

执行成功后,application.yml 文件中的敏感信息会被自动加密,并且加密后的配置值前缀会变为 ENC()

加密后的示例:

spring:
datasource:
username: ENC(qU0YwDQ3Y+X8tyuw/HPJlUsCKgMj7Zk0F+z/9tCNNMPLsSD506TM/I8U9VyXGWN0)
password: ENC(du4D62bhnGX8vcFQkamwfn/VzDLPwkmxWn4A1wyWu/e6pM0HfrOBc7lqd/vVGUEo)
redis:
password: ENC(8yn4z61PwOJTXrpVx+iQVmJbsuNEQGLFVf5TDcnKKzsge4rmInCPMKUfqIIotyGc)

3. 验证

为了确保加密和解密过程的正确性,可以通过编写简单的 REST 控制器来验证加密后的数据是否能够准确解密。以下是一个典型的控制器实现:

@RestController
public class TestController {
@Value("${spring.datasource.password}")
private String databaseUsername;
@Value("${spring.datasource.username}")
private String databasePassword;
@GetMapping("/getDatabaseInfo")
public String getDatabaseInfo() {
return "username: " + databaseUsername + ", password: " + databasePassword;
}
}

在加密之前,配置文件中可能会显示如下内容:

spring:
datasource:
username: test
password: 123456

加密后,配置文件会变为:

spring:
datasource:
username: ENC(qU0YwDQ3Y+X8tyuw/HPJlUsCKgMj7Zk0F+z/9tCNNMPLsSD506TM/I8U9VyXGWN0)
password: ENC(du4D62bhnGX8vcFQkamwfn/VzDLPwkmxWn4A1wyWu/e6pM0HfrOBc7lqd/vVGUEo)

为了确保解密过程能够正常运行,需要在 application.yml 文件中添加如下配置:

jasypt:
encryptor:
password: ADUMDFUOV7834*

重新启动项目后,你可以通过浏览器访问 localhost:8080/getDatabaseInfo 来验证加密解密是否正确。期望的输出结果为:

username: test, password: 123456

4. 线上使用

在实际生产环境中,Jasypt 的优势更加明显。只需要引入依赖,对需要加密的配置项进行简单标记,Jasypt 会自动完成加密和解密过程。

4.1 密钥管理

密钥应妥善管理,避免泄露。通过将密钥与加密后的配置分开存储,可以实现类似“锁与钥匙分开存放”的效果,确保即使有人获取到密钥,也无法单独解密出配置信息。

4.2 密钥传递方式

  • 启动命令传递:可以通过 Java 应用的启动命令来传递密钥。

    java -jar demo.jar --Djasypt.encryptor.password="ADUMDFUOV7834*"
  • 环境变量传递:通过 shell 脚本传递密钥。

     

#!/bin/bash export ENCRYPTOR_PASSWORD=ADUMDFUOV7834* java -jar -Djasypt.encryptor.password=$ENCRYPTOR_PASSWORD

通过以上方法,可以确保在不同环境中使用不同的密钥,从而实现配置信息的安全性管理。
## 总结
Jasypt 在 Spring Boot 项目中的应用提供了一种灵活且安全的配置加密方式。通过合理配置依赖和插件,可以轻松实现敏感信息的加密与解密,同时密钥管理的实现也为配置信息的安全性提供了有力保障。在实际应用中,可以根据项目需求选择最适合的加密方式,并妥善管理密钥配置,确保系统运行的安全性与稳定性。

转载地址:http://vxqfk.baihongyu.com/

你可能感兴趣的文章
Objective-C实现寻找欧拉路径/回路(附完整源码)
查看>>
Objective-C实现导弹跟踪算法(附完整源码)
查看>>
Objective-C实现将 base64 字符串转换为字节数组算法(附完整源码)
查看>>
Objective-C实现将位转换为浮点数bitsToFloat算法(附完整源码)
查看>>
Objective-C实现将列表向右旋转 k 个位置算法(附完整源码)
查看>>
Objective-C实现将字符串中大写字母转换为小写字母(附完整源码)
查看>>
Objective-C实现将字符串从一个基转换为另一个基算法(附完整源码)
查看>>
Objective-C实现将字节数组转换为 base64 编码算法(附完整源码)
查看>>
Objective-C实现将彩色图像转换为负片算法(附完整源码)
查看>>
Objective-C实现将无符号整数n变成成d进制表示的字符串s(附完整源码)
查看>>
Objective-C实现将给定的 utf-8 字符串编码为 base-16算法(附完整源码)
查看>>
Objective-C实现将给定的字符串编码为 base32算法(附完整源码)
查看>>
Objective-C实现小根堆(附完整源码)
查看>>
Objective-C实现局域网双向通信(附完整源码)
查看>>
Objective-C实现局部最大值点数算法(附完整源码)
查看>>
Objective-C实现屏幕捕获功能( 附完整源码)
查看>>
Objective-C实现峰值信噪比算法(附完整源码)
查看>>
Objective-C实现已线段的形式求曲线长算法(附完整源码)
查看>>
Objective-C实现已递归的方式找到一个数字数组的最大值算法(附完整源码)
查看>>
Objective-C实现巴比伦平方根算法(附完整源码)
查看>>