定义
Jasypt 全称 Java Simplified Encryption,是一个运行在 Java 平台上的开源加密库,其定位是让开发者用尽可能少的代码、并且不必深入了解密码学的内部细节,就能为项目添加基本的加密功能[1]。它把底层 Java 密码学扩展(Java Cryptography Extension,JCE)提供的算法封装成易用的对象和工具类,对外暴露统一的加解密接口。
按照用途划分,Jasypt 提供两类密码学操作:一类是双向的基于口令的加密(PBE),用于保护需要还原的文本、数字和二进制数据;另一类是单向的摘要与口令散列,用于校验口令是否正确或检查数据是否被改动[2]。库还附带命令行工具和针对主流框架的适配模块,因此在 Java 服务端的配置保护场景中被广泛采用[3]。
原理
双向加密的入口是 StringEncryptor 接口,常用的实现为 StandardPBEStringEncryptor,它把字符串层面的编码处理交给内部真正的引擎 StandardPBEByteEncryptor[2]。口令本身不是字节数组形式的密钥,而是经过哈希函数反复运算派生出的加密密钥;重复的次数由 keyObtentionIterations 参数控制,默认值为 1000 次[4]。默认算法为 PBEWithMD5AndDES,默认盐长度 8 字节,由 SHA1PRNG 生成随机数,密文最终以 Base64 编码输出[4]。
加密流程可以概括为下面几步[2]:\n\nmermaid\nflowchart LR\n A[口令 password] --> B[哈希多轮迭代 默认1000次]\n S[随机盐 salt] --> B\n B --> C[派生加密密钥]\n C --> D[对称加密算法\nPBEWithMD5AndDES]\n P[明文] --> D\n D --> E[Base64 编码输出]\n\n\n盐的引入使得同一明文在不同轮次加密后得到不同密文,从而降低彩虹表等预计算攻击的效果。
单向散列走的是另一条路径,由 StandardByteDigester 与 StandardStringDigester 实现,默认算法 MD5、默认盐长度 8 字节、默认迭代 1000 次,结果按「盐+哈希值」的结构拼接后编码输出[2]。字符串加密器与摘要器在输入侧统一使用 UTF-8,在输出侧使用 Base64 或十六进制,以减少跨平台字符集差异带来的不一致[2]。核心类在完成初始化后配置不可再改动,以此保证线程安全;面向高并发场景则提供池化的 PooledPBEStringEncryptor[2]。
发展历程
Jasypt 早期由 Daniel Fernández 主导开发,版本迭代中陆续加入了 Hibernate、Spring 与 Spring Security 的集成,以及对 Spring Security 2、Spring Security 3 相关组件的适配[5]。1.6 版起增加了对 Spring Framework 3.0.x 的兼容,并把 ICU4j 依赖在 Java 6 环境中改为可选[5]。
在 1.9.3 版本的更新记录中,项目扩充了摘要相关能力,加入 org.jasypt.util.password.rfc2307 包以支持 {MD5}、{SHA}、{SMD5}、{SSHA} 等 LDAP 常见口令方案,并新增 listAlgorithms 命令行命令,用于列出虚拟机中可用的摘要与 PBE 算法[5]。1.9.3 是公开发布的最后一个版本,之后项目停止维护,代码仓库仅作为历史记录保留。
与 Jasypt 配套的第三方集成组件 jasypt-spring-boot 由 Ulises Bocchio 维护,通过 jasypt-spring-boot-starter 把 Jasypt 的解密能力接入 Spring Boot 的属性加载流程,目前仍在更新。Apache Camel 自 2.5 版起提供 camel-jasypt 组件,Apache Karaf 也提供相应的集成包[3]。
应用
最常见的用途是加密配置文件中的敏感字段。使用 jasypt-spring-boot-starter 时,只需要在配置里以 ENC(密文) 的形式书写取值,应用启动过程中框架会自动解密并注入,业务代码依然可以用 @Value 之类的常规方式读取属性[6]。实现方式是为 Spring 环境中的属性源注册后处理器,使其具备识别加密内容的能力,并注册一个默认的 StringEncryptor[6]。
加密所需的密文可以由若干途径生成:调用 StringEncryptor 的 encrypt 方法、使用 Jasypt 自带的命令行工具,或使用 jasypt-maven-plugin 插件[7]。命令行工具的常用参数包括 -c 指定 encrypt 或 decrypt、-p 指定口令、-i 指定待处理文本以及 -a 指定算法[3]。解密所需的主口令通常通过启动参数或环境变量传入,例如在 java -jar 启动时以 -Djasypt.encryptor.password 的形式给出,或设置 JASYPT_ENCRYPTOR_PASSWORD 环境变量,以避免把口令硬编码进代码或配置文件[8]。
除配置加密之外,Jasypt 还可用于业务数据本身的加解密,例如对数据库中的文本字段做可逆加密,或对用户口令做不可逆的摘要存储;它在设计上支持文本、数字和二进制数据的处理。框架集成方面,库提供了 Hibernate 的类型与连接提供者、Spring 的属性占位符配置器等模块,使加解密在使用方式上对业务代码尽量透明。
局限
库本身并不负责密钥管理。主口令必须由使用方自行保管,无论它被放在启动参数、环境变量还是其他位置,都只是把风险从配置文件转移到了另一处,并不能从根本上解决密钥托管问题[9]。加密环境也需要保持一致,算法、盐生成方式、迭代次数和主口令中的任何一项在加密端与运行端不匹配,都会导致解密失败。
默认参数的强度有限。PBEWithMD5AndDES 中的 DES 属于 56 位密钥的早期算法,MD5 也已被视为弱哈希,该组合仅适合兼容性场景;此外默认模式不提供完整性校验,用错误口令解密时可能报错,也可能偶尔返回无意义的结果[10]。较新的 JDK 已把该算法标注为不安全,在加密端与运行端 JDK 版本差异较大时还可能因算法不可用而抛出异常。
性能方面,加解密运算本身开销较大,默认的迭代次数会进一步增加单次操作的成本;面向多核环境,库提供池化实现来缓解同步瓶颈,但池大小需要与处理器核心数相匹配才能取得效果。此外,Jasypt 核心库自 1.9.3 之后已不再维护,功能更新主要依赖社区维护的框架适配项目。
参见
-
Java —— Jasypt 运行所依托的编程语言与虚拟机平台
-
加密 —— Jasypt 所提供的核心能力所属的技术领域
-
Spring Boot —— 通过 jasypt-spring-boot 与 Jasypt 集成的主流应用框架
-
Hibernate —— Jasypt 提供透明加密集成的对象关系映射框架
-
基于口令的加密 —— Jasypt 双向加密功能所采用的技术方案
-
Apache Camel —— 提供 camel-jasypt 组件以加密属性文件内容
参考资料
- org.jasypt:jasypt on Maven [引用日期2026-10-14]
- 2-core-encryption-and-digesting-system [引用日期2026-10-14]
- Apache Camel: Jasypt [引用日期2026-10-14]
- stackoverflow.com 上的网页 [引用日期2026-10-14]
- File: ChangeLog.txt [引用日期2026-10-14]
- jasypt-spring-boot [引用日期2026-10-14]
- 敏感信息在 Spring Boot 配置文件里藏不住?这套加密方法帮你 "捂严实" [引用日期2026-10-14]
- Spring Boot项目中使用Jasypt进行配置文件密码加密 [引用日期2026-10-14]
- Spring Boot 配置加密:Jasypt 实战指南 [引用日期2026-10-14]
- Struct JasyptEncryptor Copy item path - Skip to main content [引用日期2026-10-14]