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

相关推荐
烛阴9 分钟前
手把手教你搭建 Express 日志系统,告别线上事故!
javascript·后端·express
良许Linux10 分钟前
请问做嵌入式开发C语言应该学到什么水平?
后端
Pitayafruit33 分钟前
SpringBoot整合Flowable【08】- 前后端如何交互
spring boot·后端·workflow
小丁爱养花1 小时前
驾驭 Linux 云: JavaWeb 项目安全部署
java·linux·运维·服务器·spring boot·后端·spring
uhakadotcom2 小时前
Amazon GameLift 入门指南:六大核心组件详解与实用示例
后端·面试·github
小杨4042 小时前
springboot框架项目实践应用十九(nacos配置中心)
spring boot·后端·spring cloud
终身学习基地3 小时前
第二篇:go包管理
开发语言·后端·golang
图南随笔3 小时前
Spring Boot(二十一):RedisTemplate的String和Hash类型操作
java·spring boot·redis·后端·缓存