springboot开发技巧-jasypt加解密实践

沉吟久,怕君恩未许,此意徘徊。

1 前言

在分布式开发中,如何确保敏感信息的安全性已成为重中之重,特别是在配置文件中,数据库连接信息、API 密钥等都是潜在的泄露风险。为了解决这些问题,Jasypt(Java Simplified Encryption)为开发者提供了一种简单且安全的加密和解密解决方案。

前段时间在做项目重构,在整理项目的配置文件时遇到了一个问题,数据库连接的账户密码都被加密了。采用的是 jasypt 加解密,之前还没有实践过这样的 ENC(xxxx)的方式,了解和实践了一番之后,有了一些心得和经验,在这里给大家做一个分享。

2 项目准备

在使用 jasypt之前,首先需要在 pom 文件中引入相关的依赖,jasypt-spring-boot-starter 是为了在项目启动时解密密文内容,jasypt-maven-plugin 是为了使用 maven 在命令行中执行加密和解密,当然这些操作可以在 java 代码中实现。

xml 复制代码
<!--  jasypt 加解密-->
<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>3.0.5</version>
</dependency>
<!--  jasypt 编译插件  jasypt.encryptor.password=test  -->
<plugin>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-maven-plugin</artifactId>
    <version>3.0.5</version>
</plugin>

3 jasypt 介绍

Jasypt 默认使用的算法是 PBEWithMD5AndDES, 其加密密钥是解密敏感信息的关键,需要确保密钥的安全存放。推荐使用环境变量、密钥管理服务或安全的配置中心来存储密钥,而非硬编码在项目中。

在使用Jasypt时,需要先使用代码或者命令行的模式,加密密码或者敏感信息等内容。通常情况下使用 BasicTextEncryptor 来进行加密或者解密内容,如下图所示:

java 复制代码
// 配置加密所需的密码
BasicTextEncryptor  textEncryptor = new BasicTextEncryptor();
textEncryptor.setPassword("password");
// 解密密文
String decryptedText = textEncryptor.decrypt("密文");
// 加密内容
String decryptedText = textEncryptor.encrypt("待加密明文");

如果对默认的加密方式或者算法有异议,可以采用PooledPBEStringEncryptor的方式来生成 StringEncryptor,可以自定义加密的密码,加密算法以及密钥的迭代次数。

java 复制代码
@Bean
public StringEncryptor stringEncryptor() {
    PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
    SimpleStringPBEConfig config = new SimpleStringPBEConfig();
    // 配置加密密钥,务必保密
    config.setPassword("passowrd");
    // 设置加密算法
    config.setAlgorithm("PBEWithMD5AndDES");
    // 设置密钥迭代次数,影响破解难度
    config.setKeyObtentionIterations("10");
    // 设置加密池的大小,1 表示单个实例使用
    config.setPoolSize("1");
    // 盐生成器类,防止彩虹表攻击
    config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
    // 设置输出编码类型为 base64
    config.setStringOutputType("base64");
    encryptor.setConfig(config);
    return encryptor;
}

4 jasypt 实践

首先需要在命令行中执行命令,生成密文或者解密明文,命令如下所示:

ini 复制代码
# jasypt:encrypt-value 加密密文 
# jasypt.encryptor.password 是加密需要的密码
# jasypt.plugin.value 是需要加密的密文
mvn jasypt:encrypt-value -Djasypt.encryptor.password="123456" -Djasypt.plugin.value="root123456!"
# 使用 jasypt:decrypt-value 解密密文
mvn jasypt:decrypt-value -Djasypt.encryptor.password="123456" -Djasypt.plugin.value="密文"

同样的,也可以使用 BasicTextEncryptor 的方式在 java 代码中实现内容的加密或者解密。

在启动项目时,需要指定解密的密码。有两种方式,其一是在执行启动命令时指定密码,其二是项目配置文件中配置解密密码,如下所示:

java 复制代码
# 启动项目时指定密码
java -Djasypt.encryptor.password=passowrd -jar myapp.jar
# 在项目中配置解密密码 
jasypt.encryptor.password=passowrd

5 总结

在本文中,主要通过项目实践介绍了 jasypt 的使用方式,通过这种加解密工具,可以使得项目中的某些敏感信息进行加密,防止信息的泄露。之前在文章中介绍了 apollo 作为配置中心的内容,如果条件允许可以使用 apollo 的加密解密功能,可以实现同样的目的。

相关推荐
JohnYan3 小时前
Bun技术评估 - 04 HTTP Client
javascript·后端·bun
shangjg33 小时前
Kafka 的 ISR 机制深度解析:保障数据可靠性的核心防线
java·后端·kafka
青莳吖4 小时前
使用 SseEmitter 实现 Spring Boot 后端的流式传输和前端的数据接收
前端·spring boot·后端
我的golang之路果然有问题5 小时前
ElasticSearch+Gin+Gorm简单示例
大数据·开发语言·后端·elasticsearch·搜索引擎·golang·gin
椰椰椰耶6 小时前
[网页五子棋][匹配模块]实现胜负判定,处理玩家掉线
java·开发语言·spring boot·websocket·spring
mldong6 小时前
我的全栈工程师之路:全栈学习路线分享
前端·后端
噼里啪啦啦.7 小时前
SpringBoot统一功能处理
java·spring boot·后端
考虑考虑7 小时前
JPA自定义sql参数为空和postgresql遇到问题
spring boot·后端·spring
向上的车轮8 小时前
Spring Boot微服务架构(十一):独立部署是否抛弃了架构优势?
spring boot·微服务·架构
橘子青衫8 小时前
Java多线程编程:深入探索线程同步与互斥的实战策略
java·后端·性能优化