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 的加密解密功能,可以实现同样的目的。

相关推荐
十月南城2 分钟前
MyBatis设计观——映射思想、动态SQL的边界与可维护性考量
后端·架构
w***4812 分钟前
CVE-2024-38819:Spring 框架路径遍历 PoC 漏洞复现
java·后端·spring
架构师沉默14 分钟前
为什么工作 10 年都没遇过分布式锁?
java·后端·架构
镜花水月linyi22 分钟前
synchronized 锁升级原理:从 JDK 8 实现到 JDK 25 演进
java·后端·java ee
零匠学堂202524 分钟前
移动学习平台与在线学习平台是什么?主要有哪些功能?
java·spring boot·学习
-大头.35 分钟前
Spring Bean作用域深度解析与实战
java·后端·spring
疯狂的程序猴41 分钟前
APP上架苹果应用商店经验教训与注意事项
后端
s***469842 分钟前
Spring Boot集成Kafka:最佳实践与详细指南
spring boot·kafka·linq
毕设源码-钟学长43 分钟前
【开题答辩全过程】以 基于springboot农科所农作物信息管理系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
i***512644 分钟前
springboot整合libreoffice(两种方式,使用本地和远程的libreoffice);docker中同时部署应用和libreoffice
spring boot·后端·docker