Jasypt数据脱敏方案

本文介绍了如何在SpringBoot项目中对MySQL和Redis的密码进行明文转密,使用jasypt工具进行对称加密,并演示了如何在单元测试、配置文件和运行环境中安全地转移加密密钥的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下是选自一个典型的springboot项目的application.properties文件:

#...省略
## 配置MySQL数据库连接
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://121.196.***.***:3306/user?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456

## 配置Redis缓存连接
redis.host=121.196.***.***
redis.port=6379
redis.password=111111

#...省略

粗略一看,似乎确实没什么问题,但是仔细一想会发现,很多密码配置都是明文,没有做任何的处理,如果直接将其上传到github等开源社区将存在被删库跑路极大风险。

那么如何对这类的配置文件进行加密处理呢?这里就引出了一款java的加解密工具jasypt,其提供了单密钥对称加密和非对称加密方式。
这里以对称加密方式来举例:

1. 引入依赖

在pom.xml中映入jasypt依赖:

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

2. 生成需要加密的密文

a. 通过单元测试生成

目前需要加密的均为密码数据,如mysql,redis等密码

@SpringBootTest
@RunWith(SpringRunner.class)
public class JasyptTest {
        @Autowired
        private StringEncryptor encryptor;
        /**
        * 手动生成密文,此处演示了url,user,password     
        */
        @Test
        public void encrypt() {
            String url = encryptor.encrypt("*.*.*.*:3306");
            String name = encryptor.encrypt("****");        
            String password = encryptor.encrypt("********");
            System.out.println("database url: " + url);
            System.out.println("database name: " + name);
            System.out.println("database password: " + password);
            Assert.assertTrue(url.length() > 0);
            Assert.assertTrue(name.length() > 0);
            Assert.assertTrue(password.length() > 0);
            }
        }

运行输出如下:

database url: Gh0BFnnOhFYDb6s5YyTBIvT9uh112n8+85Ahtz8iRqueOGKZplb/lNTOciSfYA
database name: SuvOLXWc1O7csNumRv112o+HH1kkZPfz16zZZdwp+Idfedboj3jLqQSYeUcXAck
database password: JHEPlhm468m43txHZkm/5kmsZTBkcRCwOVio8CQXcs37JvnvgI/Q1TZP6GwCTc

3. 修改配置文件

在bootstrap.yaml中添加:

jasypt:
  encryptor:
    password: asdf@2022  #本地调试,此密钥后续需要删除
    property:
        prefix: en(
        suffix: )

将需要加密的明文都替换为密文,格式为前缀(‘en(’)+密文+后缀(‘)’),具体如下所示:

data_url: en(Gh0BFnnOhFYDb6s5YyTBIvT9uhTn8+85Ahtz8iRqueOGKZplb/l+U4XNTOciSfYA)
data_username: en(SuvOLXWc1O7csNumRv1Wo+HH1kkZPfzp6zZZdwp+Idfedboj3jLqQSYe2bUcXAck)
data_password: en(JHEPlhm468mrytxHZkm/5kmsZTBycRCwOVio8CQXcs37JvnvgI/Q1TZP/H6GwCTc)

4. 转移密钥

步骤三完成后可在本地测试是否可以连接数据库成功,连接成功后需要将之前添加在配置文件bootstrap.yaml中的密钥(jasypt.encryptor.password)删除,并转移至其他地方,可选:

a.转移至程序启动时的命令行参数

修改运行脚本run.sh,加入参数:

java -jar /app.jar --jasypt.encryptor.password=asdf@2022
b.转移至程序启动时的环境变量

修改运行脚本run.sh,加入环境变量选项中:

java -Djasypt.encryptor.password=asdf@2022 -jar /app.jar
c. 在工作负载中加入环境变量

在对应服务的工作负载中加入环境变量配置:jasypt.encryptor.password=asdf@2022

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gagadack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值