使用jasypt在springboot中加密敏感信息

文章目录

1.简介

jasypt(Java Simplified Encryption)是一个轻量级Java加密库,专为简化应用程序加密操作而设计,通过易用API帮助开发者无需深入密码学知识即可实现敏感数据保护。其核心特性包括:与Spring Boot深度集成实现配置属性的自动加解密(使用ENC(密文)格式即可自动解密);支持多种主流算法如PBEWithMD5AndDES和默认的PBEWITHHMACSHA512ANDAES_256;采用分离式密钥管理机制,要求加密密钥必须通过环境变量或命令行动态注入,杜绝密钥泄露风险;提供完善的工具链如Maven插件支持命令行加密、配置文件动态解密代理及自定义盐生成器/IV向量等参数配置。典型应用场景涵盖保护Spring Boot配置文件中的数据库密码/API密钥、实现日志/数据库的PII信息脱敏,以及满足GDPR/等保2.0等合规要求,其通过AES-256等标准算法结合随机盐与迭代哈希,在密钥妥善保管时可提供极高安全性保障。

项目地址:https://github.com/ulisesbocchio/jasypt-spring-boot

2.加密敏感信息

2.1 引入Maven加密插件

在pom.xml中添加:

<build><plugins><plugin><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-maven-plugin</artifactId><version>3.0.5</version></plugin></plugins></build>

2.2 执行加密命令

在项目目录执行:

mvn jasypt:encrypt-value \ -Djasypt.encryptor.password="your-password"\ -Djasypt.plugin.value="原始敏感值"

控制台输出加密结果(如ENC(In+7esX42WEldd+Wzr4FaI2H2w6d0jXMWfUM1m6HbR+43kV0J7Qq9uXYeGqQqJh6)),复制备用。

3.在Spring Boot中使用

3.1 添加依赖

<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.5</version></dependency>

3.2 配置文件

在application.properties中:

apiKey=ENC(In+7esX42WEldd+Wzr4FaI2H2w6d0jXMWfUM1m6HbR+43kV0J7Qq9uXYeGqQqJh6) jasypt.encryptor.iv-generator-classname=org.jasypt.iv.NoIvGenerator jasypt.encryptor.algorithm=PBEWithMD5AndDES 

3.3 Java类示例

@SpringBootApplicationpublicclassDemoApplicationimplementsCommandLineRunner{@Value("${apiKey}")privateString apiKey;publicstaticvoidmain(String[] args){SpringApplication.run(DemoApplication.class, args);}@Overridepublicvoidrun(String... args){System.out.println("apiKey = "+ apiKey);}}

3.4 启动应用

通过环境变量传递密钥:

exportJASYPT_ENCRYPTOR_PASSWORD=your-password java -jar app.jar 

IDEA中环境变量使用如下方式传入:

58-1

或使用命令行参数:

java -jar app.jar --jasypt.encryptor.password=your-password 

4.注意事项

  • 密钥安全:切勿将加密密钥写入配置文件或代码
  • 密钥传递方式:
    • 环境变量:export JASYPT_ENCRYPTOR_PASSWORD=密钥
    • 命令行参数:java -jar app.jar --jasypt.encryptor.password=密钥
  • 加解密算法需保持一致

5.进阶配置参数

参数必需默认值
jasypt.encryptor.password-
jasypt.encryptor.algorithmPBEWITHHMACSHA512ANDAES_256
jasypt.encryptor.key-obtention-iterations1000
jasypt.encryptor.pool-size1
jasypt.encryptor.provider-nameSunJCE
jasypt.encryptor.provider-class-namenull
jasypt.encryptor.salt-generator-classnameorg.jasypt.salt.RandomSaltGenerator
jasypt.encryptor.iv-generator-classnameorg.jasypt.iv.RandomIvGenerator
jasypt.encryptor.string-output-typebase64
jasypt.encryptor.proxy-property-sourcesfalse
jasypt.encryptor.skip-property-sourcesempty list

6.小结

通过jasypt可实现:

  1. 使用Maven插件加密敏感信息
  2. Spring Boot自动解密ENC()包裹的配置值
  3. 通过环境变量/命令行安全传递密钥
  4. 支持多种加密算法和高级配置
    完整方案确保敏感信息(如API密钥、数据库密码)不在配置文件中明文暴露。

Read more

【数据结构】栈和队列的定义与实现

【数据结构】栈和队列的定义与实现

主页:HABUO🍁主页:HABUO 🍁如果再也不能见到你,祝你早安,午安,晚安🍁 1.栈 1.1 栈的定义及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。 出栈:栈的删除操作叫做出栈。出数据也在栈顶。 如下图所示: 总结:其实栈就是一个后进先出的一个容器,注意可以边进边出,什么意思呢?例如上述图,a1进栈之后可以出栈之后a2再进栈,因此一个入栈序列可以对应多个出栈序列。  1.2 栈的实现 分析:我们前面学过了顺序表也即是可以动态增容的数组,也学过了链表,无论是带头不带头、循环不循环、双向不双向,我们是不是都搞定了。

By Ne0inhk
【数据结构-初阶】详解线性表(5)---队列

【数据结构-初阶】详解线性表(5)---队列

🎈主页传送门:良木生香 🔥个人专栏:《C语言》 《数据结构-初阶》 《程序设计》 🌟人为善,福随未至,祸已远行;人为恶,祸虽未至,福已远离 上期回顾:在上一篇文章(【数据结构-初阶】详解栈和队列(1)---栈)中我们讲到了在顺序表与链表之外的另一种线性表---栈,知道了这是一种具有先进后出和后进先出特点的数据结构,既然有先进后出,那么肯定就有先进先出的数据结构,所以这就是我们今天要讲的------队列 一、队列的概念 既然我们想要实现先进先出的效果,那肯定就不像栈那样有一端是堵起来的,想必应该是两端都开口吧。嗯,事实确实如此。 队列:是只允许在一端进行数据的插入操作,在另一端进行数据的删除操作的一种特殊的线性表,其具有先进先出FIFO(first in first out)的结构特点. 入队列:进行插入操作的一端叫做队尾 出队列:进行删除操作的一端叫做队头 下面是队列的示意图: 名字叫做队列,其实就像我们排队一样,先排的人先得服务,后排的人后得到服务,在队列中,先进来的元素先得到操作,

By Ne0inhk
【递归、搜索与回溯算法必刷42题:专题一】从汉诺塔问题到快速幂

【递归、搜索与回溯算法必刷42题:专题一】从汉诺塔问题到快速幂

🎬 个人主页:艾莉丝努力练剑 ❄专栏传送门:《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录》 《Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享》 ⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平 🎬 艾莉丝的简介: 🎬艾莉丝的算法专栏简介: 文章目录 * 本文设计专题一算法题链接 * 1 汉诺塔问题 * 题目描述 * 汉诺塔问题(递归解法) * 1. 问题描述 * 2. 递归思想 * 基本情况(递归终止条件) * 递归分解(n ≥ 2) * 3. 递归算法流程(函数设计) * 函数头 * 递归函数流程: * 解题过程 * 算法实现(C++) * 2 合并两个有序链表 * 题目描述 * 解题过程 * 算法实现(

By Ne0inhk

人脸识别核心算法深度解析:FaceNet与ArcFace从原理到实战

本文深入剖析人脸识别领域两大里程碑算法——Google的FaceNet和InsightFace的ArcFace,从数学原理、损失函数设计到完整PyTorch实现,帮你彻底理解现代人脸识别技术的核心。 一、引言:人脸识别的本质问题 1.1 人脸识别 ≠ 图像分类 初学者常有的误解:把人脸识别当作分类问题。 ❌ 错误思路:分类方法 输入人脸 → CNN → Softmax → 输出"这是第1532号人" 问题: 1. 类别数巨大(十亿级身份) 2. 无法处理新注册的人(需要重新训练) 3. 每个人样本极少(很难训练好分类器) ✅ 正确思路:度量学习方法 输入人脸 → CNN → 特征向量(embedding) → 与数据库比对 优势: 1. 只需学习"什么是相似",不需要预定义类别 2. 新人注册只需提取特征,无需重新训练

By Ne0inhk