springboot使用jasypt对yml文件配置内容进行加密(例:数据库密码加密)
前言
在springboot的项目开发中,大多数情况下 yml 配置文件中存储的密码均以明文形式展示,这种方式显然存在较大的安全隐患。一旦有开发人员离职,其可能会利用掌握的密码信息进行不当操作,从而对系统安全造成威胁。因此,为了提升系统的安全性,我们有必要对配置文件中的敏感信息(如密码)进行加密处理。
通过加密,只有特定的人员(例如领导、架构师或技术经理)知晓解密所需的密钥,而普通开发人员无法直接获取到明文密码。这样不仅可以有效降低因密码泄露带来的风险,还能更好地保护系统的敏感数据,确保信息安全可控。这一措施不仅符合最佳安全实践,也是企业安全管理的重要一环。
一、jasypt 简介
jasypt 是一个用于 java 的简易加密库,它允许开发者以最小的努力为项目添加基本的加密功能,而无需深入了解密码学的工作原理。jasypt 提供了多种加密算法,并且可以与 spring boot 无缝集成,使得开发者能够轻松地对配置文件中的敏感信息进行加密。
二、环境准备
在开始之前,请确保已经安装并配置好了以下工具和环境:
- jdk 8 或更高版本
- maven 或 gradle 构建工具
- intellij idea 或其他 ide
- spring boot 项目
三、步骤详解
1. 引入 jasypt 依赖
在 pom.xml
文件中添加 jasypt 的依赖:
<!-- jasypt 加解密--> <dependency> <groupid>com.github.ulisesbocchio</groupid> <artifactid>jasypt-spring-boot-starter</artifactid> <version>2.1.2</version> </dependency>
注意:如果你使用的是 jdk 8,请确保选择适合的 jasypt 版本(通常是 2.x),而对于 jdk 9 及以上版本,则应选择 3.x 版本。
2. 配置秘钥与测试
为了保证安全性,我们需要设置一个加密密钥,该密钥将用于加密和解密敏感信息。
接下来,我们需要对敏感信息(如数据库密码)进行加密。可以通过编写一个简单的工具类来完成这一任务。
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.setalgorithm("pbewithmd5anddes"); // 设置加密算法,默认的 config.setpassword("lvdamao"); // 用于加密的秘钥(盐),可以是随机字符串,一定要记住并且存储好 encryptor.setconfig(config); // 对自己的密码进行加密 string mypwd = "huang3978850"; string encryptedpwd = encryptor.encrypt(mypwd); system.out.println("++++++++++++++++++++++++++++++"); system.out.println("+ 原密码为:" + mypwd); system.out.println("+ 加密后的密码为:" + encryptedpwd); system.out.println("++++++++++++++++++++++++++++++"); // 备注:此方式也可以用于账号密码登录的加盐操作 } // m4g9wdfnu4gmiwbcrgzjnf4t80nfo4yc @test public void testpwddecrypt() { // 实例化加密器 standardpbestringencryptor encryptor = new standardpbestringencryptor(); // 配置加密算法和秘钥 environmentpbeconfig config = new environmentpbeconfig(); config.setalgorithm("pbewithmd5anddes"); // 设置加密算法,默认的 config.setpassword("lvdamao"); // 用于加密的秘钥(盐),可以是随机字符串,一定要记住并且存储好 encryptor.setconfig(config); string pendingpwd = "m4g9wdfnu4gmiwbcrgzjnf4t80nfo4yc"; string mypwd = encryptor.decrypt(pendingpwd); system.out.println("++++++++++++++++++++++++++++++"); system.out.println("+ 解密后的密码为:" + mypwd); system.out.println("++++++++++++++++++++++++++++++"); } }
执行测试加密程序,获得加密后的字符串
例如:
秘钥:lvdamao,密码:lvdamaoluguo,加密后:q+distq05v6eng/dcvcc6kpk0f8vc0ii
将秘钥lvdamao
和加密后的字符串q+distq05v6eng/dcvcc6kpk0f8vc0ii
填入第二段测试代码进行解密测试:
成功得到原始密码lvdamaoluguo则表示成功
使用思路:可以给项目经理或者架构师使用此工具,通过秘钥和原始密码(例如数据库密码),获取到一个新的加密后的字符串,后续其他项目开发人员只能拿到加密字符串对数据库进行连接,从而有效的减少了数据库密码的暴露风险
3. 修改配置文件
找到项目的启动文件所在模块,修改application.yml配置文件
设置jasypt和秘钥lvdamao
jasypt: encryptor: algorithm: pbewithmd5anddes password: lvdamao
将加密后的字符串替换掉原来的明文密码,并确保格式正确:
spring: datasource: # 数据源的相关配置 type: com.zaxxer.hikari.hikaridatasource # 数据源的类型,可以更改为其他的数据源配置,比如druid driver-class-name: com.mysql.cj.jdbc.driver # mysql/mariadb 的数据库驱动类名称 url: jdbc:mysql://192.168.88.160:3306/mpw-dev?useunicode=true&characterencoding=utf-8&autoreconnect=true&usessl=false&allowpublickeyretrieval=true&servertimezone=utc username: root password: enc(q+distq05v6eng/dcvcc6kpk0f8vc0ii) hikari: connection-timeout: 30000 # 等待连接池分配连接的最大时间(毫秒),超过这个时长还没有可用的连接,则会抛出sqlexception minimum-idle: 5 # 最小连接数 maximum-pool-size: 20 # 最大连接数 auto-commit: true # 自动提交 idle-timeout: 600000 # 连接超时的最大时长(毫秒),超时则会被释放(retired) pool-name: datasourcehikaricp # 连接池的名字 max-lifetime: 18000000 # 连接池的最大生命时长(毫秒),超时则会被释放(retired) connection-test-query: select 1 # 用于发送sql语句保持连接状态
例如在数据库密码上使用
4. 测试解密功能
当 spring boot 应用启动时,jasypt 会自动对 enc()
标识的字符串进行解密。可以通过以下方式验证解密是否成功:
import lombok.extern.slf4j.slf4j; import org.springframework.beans.factory.annotation.value; import org.springframework.web.bind.annotation.getmapping; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.restcontroller; @slf4j @restcontroller @requestmapping("/test") public class helloworld { @value("${spring.datasource.password}") private string decryptedpassword; @getmapping("/paswword") public string hello(){ return "decrypted password: " + decryptedpassword; } }
访问 /password
接口,应该能够看到解密后的明文密码。
四、进阶配置
1. 自定义加密标识
默认情况下,jasypt 使用 enc()
作为加密标识。如果你希望自定义加密标识,可以在 application.yml
文件中进行如下配置:
jasypt: encryptor: property: prefix: my_enc( suffix: ) password: your-secret-key
这样,加密后的字符串将以 my_enc()
形式表示。
2. 指定加密算法
jasypt 默认使用 pbewithmd5anddes
算法进行加密。如果你希望使用更高级别的加密算法(如 aes),可以在 application.yml
文件中指定:
jasypt: encryptor: algorithm: pbewithhmacsha512andaes_256 iv-generator-classname: org.jasypt.iv.noivgenerator password: your-secret-key
注意:某些高级加密算法可能需要安装 java cryptography extension (jce) 无限强度权限策略文件。
五、总结
通过本文的学习,我们了解了如何在 spring boot 项目中使用 jasypt 对 application.yml
文件中的敏感信息进行加密。具体步骤包括引入 jasypt 依赖、配置加密密钥、加密敏感信息以及测试解密功能。此外,还介绍了如何自定义加密标识和指定加密算法等进阶配置。
使用 jasypt 不仅可以提高配置文件的安全性,还可以减少因配置文件泄露而导致的安全风险。希望本文对你有所帮助!
到此这篇关于springboot使用jasypt对yml文件配置内容进行加密(例:数据库密码加密)的文章就介绍到这了,更多相关springboot jasypt配置内容加密内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论