当前位置: 首页 > news >正文

SpringBoot集成 Jasypt 实现数据源连接信息进行加密

SpringBoot集成 Jasypt 实现数据源连接信息进行加密

在实际项目中,敏感信息(如数据库连接的 URL、用户名、密码等)直接暴露在配置文件中可能导致安全隐患。为了解决这一问题,可以使用 Jasypt 来加密敏感信息,并在运行时解密,从而有效提升安全性。

在这里插入图片描述


一、什么是 Jasypt

Jasypt(Java Simplified Encryption) 是一个开源的 Java 加密工具库,它支持对配置文件中的敏感数据进行加密和解密操作,特别适用于 Spring Boot 项目。


二、项目环境准备

1. 添加 Jasypt 依赖

pom.xml 中添加以下依赖,可在https://mvnrepository.com查看最新版本:

<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.5</version>
</dependency>
2. 数据库配置示例

application.yml 中定义数据库配置:

spring:datasource:url: ENC(U2FsdGVkX1+...)username: ENC(U2FsdGVkX1+...)password: ENC(U2FsdGVkX1+...)rabbitmq:host: ENC(U2FsdGVkX1+...)port: ENC(U2FsdGVkX1+...)username: ENC(U2FsdGVkX1+...)password: ENC(U2FsdGVkX1+...)redis:host: ENC(U2FsdGVkX1+...)port: ENC(U2FsdGVkX1+...)database: ENC(U2FsdGVkX1+...)password: ENC(U2FsdGVkX1+...)
jasypt:encryptor:# 加密的密钥,生成环境放到启动参数配置password: ${JASYPT_ENCRYPTOR_PASSWORD:默认秘钥}# 加密算法algorithm: PBEWithHMACSHA256AndAES_128iv-generator-classname: org.jasypt.iv.RandomIvGenerator# 算法识别的前后缀,默认ENC()property:prefix: "ENC("suffix: ")"

以上 ENC(...) 是加密后的密文,将在后续步骤中生成。


三、生成加密密文

Jasypt 提供多种工具生成加密密文,以下分别介绍两种方式:

方法 1:使用 Jasypt CLI 工具
  1. 下载 CLI 工具
    下载 jasypt-1.9.3-dist.zip,解压后进入jasypt-1.9.3-dist\jasypt-1.9.3\lib目录。

  2. 执行加密命令
    使用以下命令生成加密密文:

    java  -cp  jasypt-1.9.3.jar  org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="明文数据" password=加密密钥  algorithm=PBEWithHMACSHA256AndAES_128 ivGeneratorClassName=org.jasypt.iv.RandomIvGenerator
    

    示例输出

    ENC(U2FsdGVkX1+...)
    
  3. 解密验证

    java  -cp  jasypt-1.9.3.jar  org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input="密文数据" password=加密秘钥  algorithm=PBEWithHMACSHA256AndAES_128 ivGeneratorClassName=org.jasypt.iv.RandomIvGenerator
    
方法 2:使用 Java 代码生成密文

编写以下代码:

public class JasyptEncryptorDemo {public static void main(String[] args) {PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();SimpleStringPBEConfig config = new SimpleStringPBEConfig();config.setPassword("加密秘钥");config.setAlgorithm("PBEWithHMACSHA256AndAES_128"); // 加密方式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);System.out.println(encryptor.encrypt("明文数据")); // 加密System.out.println(encryptor.decrypt("密文数据")); // 解密}
}

执行后,控制台输出加密密文。


四、解密与运行验证

1. 配置 Jasypt 解密器

application.yml 中配置解密相关参数:

jasypt:encryptor:password: ${JASYPT_ENCRYPTOR_PASSWORD:secureKey123!}   # 环境变量优先algorithm: PBEWithHMACSHA512AndAES_256property:prefix: "ENC("suffix: ")"
2. 编写解密验证代码

创建一个测试控制器,验证加密后的配置是否能正确解密:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class TestController {@Value("${spring.datasource.password}")private String password;@GetMapping("/test")public String testDecryption() {return "Decrypted password: " + password;}
}

运行项目,访问 /test,若解密成功,将返回明文密码。


五、常见加密算法

Jasypt 支持多种加密算法,以下是常见算法及其特点:

算法名称特点ivGeneratorClassName
PBEWithMD5AndDES基于 MD5 和 DES 的加密算法,安全性较低,不建议在生产环境使用。org.jasypt.iv.NoIvGenerator
PBEWithMD5AndTripleDES使用 MD5 生成密钥,Triple DES(3DES)进行加密;比单 DES 更安全,适合一般安全需求场景。org.jasypt.iv.NoIvGenerator
PBEWithHMACSHA256AndAES_128使用 SHA-256 和 AES-128,兼顾性能与安全性;性能和安全性平衡,适用大部分应用场景。org.jasypt.iv.RandomIvGenerator
PBEWithHMACSHA512AndAES_256高安全性算法,适用于需要高敏感数据保护的场景;(金融等)。org.jasypt.iv.RandomIvGenerator

六、安全注意事项

  1. 加密密钥管理

    • 加密密钥建议通过环境变量或密钥管理工具传递,避免硬编码在配置文件中。
    • 使用复杂的密钥,例如包含字母、数字和特殊字符的随机字符串。
  2. 生产环境建议

    • 数据库连接信息的加密仅是基础安全措施,建议结合防火墙、网络隔离等多层次保护。
    • 定期更换加密密钥,并重新加密敏感数据。
  3. 性能权衡

    • 高安全性算法如 PBEWithHMACSHA512AndAES_256 对性能要求更高,需根据实际情况选择合适的算法。

七、总结

通过集成 Jasypt,可以有效保护 Spring Boot 项目中的敏感信息,提升安全性。在实际使用中,可以结合其他安全措施(如环境变量、权限控制)进一步加强数据保护。


http://www.mrgr.cn/news/77682.html

相关文章:

  • JavaWeb后端开发知识储备2
  • Go语言中的条件变量:sync.NewCond
  • 何以解忧-解决python问题的辛酸泪
  • 力扣刷题--21.合并两个有序链表
  • Unity Shader常见函数 内置Built-in/URP等效函数
  • 如何配置 Flink CDC 连接 OceanBase 实现数据实时同步
  • 视频对接rtsp协议学习
  • Elasticsearch是如何实现Master选举的?
  • transformer.js(一):这个前端大模型运行框架的可运行环境、使用方式、代码示例以及适合与不适合的场景
  • Altium Designer学习笔记 6-10 异性元件库创建_原理图绘制
  • 【Linux清空显存占用】Linux 系统中清理 GPU 显存
  • PostgreSQL 性能优化全方位指南:深度提升数据库效率
  • React基础知识一
  • 论文复现_How Machine Learning Is Solving the Binary Function Similarity Problem
  • 解决 Android 单元测试 No tests found for given includes:
  • golang调用webview,webview2,go-webview2
  • 【分享一个vue指令】复制指令v-copy
  • 20241121 android中树结构列表(使用recyclerView实现)
  • 设计模式:4、命令模式(双重委托)
  • Altium Designer学习笔记 11-15 原理图的封装 编译 检查 _PCB封装库的创建
  • Android Studio 设置不显示 build-tool 无法下载
  • 各种语言书籍下载
  • leetcode-44-通配符匹配
  • 【web前端笔记】vue3 + vite的前端项目中,使用import.meta.glob()方法实现全局注册组件的通用代码
  • Linux从入门到精通
  • wsl使用