一、什么是Jasypt?
Jasypt(Java Simplified Encryption)是一个强大的Java加密库,专门用于简化应用程序中的加密操作。在Spring Boot项目中,我们经常需要处理敏感配置信息(如数据库密码、API密钥等),Jasypt可以帮助我们加密这些敏感配置,避免明文存储的安全风险。
二、为什么需要Jasypt?
传统配置的问题
1 2 3 4 5 6 7 8 9 10
| spring: datasource: driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/my_db username: root password: root api: key: "sk-1234567890abcdef"
|
使用Jasypt后的安全配置
1 2 3 4 5 6 7 8 9 10
| spring: datasource: driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/my_db username: "ENC(AbCdEfGhIjKlMnOpQrStUvWxYz0123456789==)" password: "ENC(AbCdEfGhIjKlMnOpQrStUvWxYz0123456789==)"
api: key: "ENC(ZxYwVuTsRqPoNmLkJiHgFeDcBa9876543210==)"
|
- 看到
ENC(...) 了吗?这就是被Jasypt加密后的密文。即使日志被打出来,即使代码被泄露,没有秘钥,黑客看到的也只是一串无意义的字符。
三、快速开始:Spring Boot集成Jasypt
1. 添加依赖
1 2 3 4 5 6 7 8 9 10 11
| <properties> <jasypt-spring-boot.version>3.0.5</jasypt-spring-boot.version> </properties>
<dependencies> <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>${jasypt-spring-boot.version}</version> </dependency> </dependencies>
|
2. 基础配置
在application.yml中添加Jasypt配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| jasypt: encryptor: password: ${JASYPT_PASSWORD:rstyro_#$%66dashun} algorithm: PBEWITHHMACSHA512ANDAES_256 salt-generator-classname: org.jasypt.salt.RandomSaltGenerator iv-generator-classname: org.jasypt.iv.RandomIvGenerator property: prefix: "ENC(" suffix: ")"
|
安全提醒:生产环境务必通过环境变量JASYPT_PASSWORD设置密钥,避免硬编码!
3、实战
①、加密工具类
首先创建一个加密工具类,用于生成加密值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| public class JasyptUtil {
private static final String SECRET_KEY = "rstyro_#$%66dashun";
private static SimpleStringPBEConfig getPBEConfig() { SimpleStringPBEConfig config = new SimpleStringPBEConfig(); config.setPassword(SECRET_KEY); config.setAlgorithm("PBEWithHMACSHA512AndAES_256"); config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator"); return config; }
private static StandardPBEStringEncryptor getEncryptor() { StandardPBEStringEncryptor stringEncryptor = new StandardPBEStringEncryptor(); stringEncryptor.setConfig(getPBEConfig()); return stringEncryptor; }
public static String encrypt(String data) { return getEncryptor().encrypt(data); }
public static String decrypt(String data) { return getEncryptor().decrypt(data); }
public static void main(String[] args) { String rawPassword = "your_sensitive_data"; String encrypted = encrypt(rawPassword); System.out.println("原始数据: " + rawPassword); System.out.println("加密结果: " + encrypted); System.out.println("解密验证: " + decrypt(encrypted)); } }
|
- 使用
encrypt(data) 进行加密,得到密文,decrypt(data) 解密得到明文
②、 配置文件使用加密值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| spring: application: name: springboot-jasypt datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/neighbor?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Hongkong&autoReconnect=true&allowPublicKeyRetrieval=true username: ENC(WaH05jih3tX0v/orZkYwbXcIIs3yD0VXAKmKn962FSxDhgtGFAj3fBN58Ye/6kZ2) password: ENC(WaH05jih3tX0v/orZkYwbXcIIs3yD0VXAKmKn962FSxDhgtGFAj3fBN58Ye/6kZ2)
jasypt: encryptor: password: ${JASYPT_PASSWORD:rstyro_#$%66dashun} algorithm: PBEWITHHMACSHA512ANDAES_256 salt-generator-classname: org.jasypt.salt.RandomSaltGenerator iv-generator-classname: org.jasypt.iv.RandomIvGenerator property: prefix: "ENC(" suffix: ")"
|
- 如上,我们的数据库用户名和密码都是使用加密值:
ENC()
③、测试一下配置获取
新建一个controller,JasyptController
1 2 3 4 5 6 7 8 9 10 11 12 13
| @RestController @RequestMapping("/jasypt") public class JasyptController {
@Resource private Environment environment;
@GetMapping("/getConfig") public Object getConfig(String key){ return environment.getProperty(key); } }
|
- 启动服务请求一下:
http://localhost:8080/jasypt/getConfig?key=spring.datasource.password
- 验证一下我们是可以得到明文的,对我们的业务不会产生影响
/%E6%88%90Jasypt%E7%BB%99%E9%85%8D%E7%BD%AE%E5%8A%A0%E5%AF%86/valid.png)
- 验证成功! Spring Boot自动解密,业务代码无感知使用!
四、总结
Jasypt提供的是一种“低侵入、高收益”的解决方案。它就像一个忠诚的卫士,用最简单的方式,为你的应用配置筑起了一道坚实的安全防线。
从此,你再也不用担心配置泄露.
资源获取:
本文完整代码已上传至 GitHub,欢迎 Star ⭐ 和 Fork
欢迎分享你的经验:
在实际使用Jasypt时,你有哪些独到的见解或踩坑经验?欢迎在评论区交流讨论,让我们一起进步