再也不怕离职同事泄露配置文件的密码了

Jasypt是一个功能强大、易于使用的Java加密库,适用于需要进行数据加密和安全保护的各类应用程序和系统。

实战

1、引入依赖

说明:JDK1.8 选择2.x版本,高一些版本的JDK就选择3.x的版本。

xml 复制代码
xml

<!-- jasypt 加解密 -->
<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>2.1.2</version>
</dependency>

2、编写测试代码

我们编写SpringBootTest测试类,来完成加解密的基本功能。

其中testPwdEncrypt()是加密方法,testPwdDecrypt()是解密方法。

arduino 复制代码
java

import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.EnvironmentPBEConfig;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class JasyptTest {

    @Test
    public void testPwdEncrypt() {

        // 实例化加密器
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();

        // 配置加密算法和秘钥
        EnvironmentPBEConfig config = new EnvironmentPBEConfig();
        config.setPassword("chengxuyuanjidian");      // 用于加密的秘钥(盐),可以是随机字符串,或者固定,一定要存储好,不要被其他人知道
        config.setAlgorithm("PBEWithMD5AndDES");    // 设置加密算法,默认
        encryptor.setConfig(config);

        // 对密码进行加密
        String myPwd = "imooc";
        String encryptedPwd = encryptor.encrypt(myPwd);
        System.out.println("++++++++++++++++++++++++++++++");
        System.out.println("+ 原密码为:" + myPwd);
        System.out.println("+ 加密后的密码为:" + encryptedPwd);
        System.out.println("++++++++++++++++++++++++++++++");
    }

    @Test
    public void testPwdDecrypt() {

        // 实例化加密器
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();

        // 配置加密算法和秘钥
        EnvironmentPBEConfig config = new EnvironmentPBEConfig();
        config.setPassword("chengxuyuanjidian");      // 用于加密的秘钥(盐),可以是随机字符串,或者固定,一定要存储好,不要被其他人知道
        config.setAlgorithm("PBEWithMD5AndDES");    // 设置加密算法,默认
        encryptor.setConfig(config);

        // 对密码进行解密
        String pendingPwd = "XD8gz6KU4d/n3DKgeNASBw==";
        String myPwd = encryptor.decrypt(pendingPwd);
        System.out.println("++++++++++++++++++++++++++++++");
        System.out.println("+ 解密后的密码为:" + myPwd);
        System.out.println("++++++++++++++++++++++++++++++");
    }

}

如上代码,我们假设对rabbitmq的密码进行加密,比如就是默认的guest,我们做一下加密,我设置的盐是chengxuyuanjidian(程序员济癫拼音),打印出来结果是:

diff 复制代码
++++++++++++++++++++++++++++++
+ 原密码为:guest
+ 加密后的密码为:XD8gz6KU4d/n3DKgeNASBw==
++++++++++++++++++++++++++++++

同样的,我们调用解密方法,对内容进行解密,也能得到原来的guest。

diff 复制代码
++++++++++++++++++++++++++++++
+ 解密后的密码为:guest
++++++++++++++++++++++++++++++

3、配置文件加密

好了,接下来,我们可以对配置文件的某些内容进行加密了,这里我就以application.yml中关于rabbitmq的密码进行加密。

首先,我们在配置文件中加上Jasypt的配置,这样启动后会自动加入Spring容器管理。

yaml 复制代码
yml

jasypt:
  encryptor:
    algorithm: PBEWithMD5AndDES # 算法,这里使用默认的。
    password: chengxuyuanjidian # 盐,和测试类的一样。

然后,我们通过测试类获得rabbitmq对密码加密后的字符串,假设还是guest,那么我们就拿到了XD8gz6KU4d/n3DKgeNASBw==。

所以,在yml中像这样配置下:

yaml 复制代码
yml

spring:
  rabbitmq:
    host: 192.168.1.122
    port: 5672
    virtual-host: /
    username: guest
    password: ENC(XD8gz6KU4d/n3DKgeNASBw==)
    listener:
      simple:
        acknowledge-mode: manual  # 手动ack确认

jasypt:
  encryptor:
    algorithm: PBEWithMD5AndDES
    password: chengxuyuanjidian

rabbitmq的password使用 ENC(加密后的字符串) 的形式来书写,这样当项目启动后,Spring容器会使用Jasypt工具对配置文件中的密文进行解密,得到真正的配置内容。

总结

用法其实很简单,不得不说这个工具很实用。

最后说一句(求关注!别白嫖!)

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、转发、在看。

关注公众号:woniuxgg,在公众号中回复:笔记 就可以获得蜗牛为你精心准备的java实战语雀笔记,回复面试、开发手册、有超赞的粉丝福利!

相关推荐
星核0penstarry38 分钟前
企业 API 向后兼容实战:版本控制、废弃字段通知与灰度发布策略
人工智能·后端·api·接口隔离原则·版本控制·架构设计·后端架构
用户别睡觉1 小时前
自己搭的中文 PDF RAG 接了 Redis 缓存、跑了 RAGAS,以为能写“提速多少、准确率多少”,结果两个都没按预期来。
后端
彭亚川Allen1 小时前
985 在职研究生到底怎么样?是不是水硕?是不是.....?
前端·后端·程序员
乘风2481 小时前
# 我做了个会遗忘的 AI 记忆,召回率反而从 8% 涨到 100%
后端
Rain的Java大神之路2 小时前
面试被LeetCode 27(移除元素)问懵?别再用两层 for 循环了:一道“简单题”吃透双指针原地删除,附面试加分话术 + 11 个避坑清单
后端·leetcode·面试
利威尔xu2 小时前
Go IM 源码实战(11):token 只是个 HASH,多端互踢的顺序错了就踢错人
后端·微服务·面试·架构·golang
猿究院--Cu-Sn合金2 小时前
Spring Boot + DeepSeek 求职 Agent 实践:工具注册、多轮调用与简历 JD 对比
数据库·人工智能·spring boot·后端·deepseek
程序员cxuan2 小时前
别学 subagent 了,很可能要凉了。
后端·agent·ai编程
小咕聊编程3 小时前
基于Django的个人摄影博客网站设计与开发
后端·python·django
未秃头的程序猿3 小时前
@ConditionalOnMissingBean 把我配好的 RabbitMQ 手动 ack 吃掉了
后端·rabbitmq