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

相关推荐
ningqw6 小时前
SpringBoot 常用跨域处理方案
java·后端·springboot
你的人类朋友6 小时前
vi编辑器命令常用操作整理(持续更新)
后端
胡gh7 小时前
简单又复杂,难道只能说一个有箭头一个没箭头?这种问题该怎么回答?
javascript·后端·面试
一只叫煤球的猫8 小时前
看到同事设计的表结构我人麻了!聊聊怎么更好去设计数据库表
后端·mysql·面试
uzong8 小时前
技术人如何对客做好沟通(上篇)
后端
颜如玉8 小时前
Redis scan高位进位加法机制浅析
redis·后端·开源
Moment9 小时前
毕业一年了,分享一下我的四个开源项目!😊😊😊
前端·后端·开源
why技术9 小时前
在我眼里,这就是天才般的算法!
后端·面试
绝无仅有9 小时前
Jenkins+docker 微服务实现自动化部署安装和部署过程
后端·面试·github
程序视点9 小时前
Escrcpy 3.0投屏控制软件使用教程:无线/有线连接+虚拟显示功能详解
前端·后端