实战——SpringBoot 密码等敏感信息加解密方案

实际项目中经常会遇到设置数据库账号密码明文,容易泄露的问题,如何解决?

方法有很多,本文通过jasypt对密码等敏感信息进行加密

操作步骤:

1、添加依赖

xml 复制代码
<!-- 添加依赖 -->
<dependency>
	<groupId>com.github.ulisesbocchio</groupId>
	<artifactId>jasypt-spring-boot-starter</artifactId>
	<version>3.0.3</version>
</dependency>

2、application.yml文件增加配置

yml 复制代码
jasypt:
    encryptor:
        #默认加密算法:PBEWITHHMACSHA512ANDAES_256,sha512+AES算法,安全性更高,但是需要 Java JDK 1.9+
    	#本服务使用jdk1.8,所以使用 PBEWithMD5AndDES md5+des算法
    	#默认使用 com.ulisesbocchio.jasyptspringboot.encryptor.DefaultLazyEncryptor 进行加解密 ,PooledPBEStringEncryptor可以对	其加密的内容进行解密
        algorithm: PBEWITHHMACSHA512ANDAES_256
        # 加密的盐值,为了安全,该配置可以放在启动参数或者命令行参数中
        password: 密钥
        property:
        	# 默认值前缀、后缀、iv-generator-classname
            prefix: ENC(
            suffix: )
        iv-generator-classname: org.jasypt.iv.RandomIvGenerator

3、生成加密后的密钥

java 复制代码
package com.controller;

import org.jasypt.encryption.StringEncryptor;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;

@SpringBootTest
public class Demo {
    @Resource
    StringEncryptor encryptor;

    @Test
    public void encrypt() {
        String url = encryptor.encrypt("jdbc:mysql://ip:3306/db_name?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai");
        String username = encryptor.encrypt("账号");
        String pwd = encryptor.encrypt("密码1");
        String redisPwd = encryptor.encrypt("密码2");
        System.out.println("url = " + url);
        System.out.println("username = " + username);
        System.out.println("pwd = " + pwd);
        System.out.println("redisPwd = " + redisPwd);
    }
    @Test
    public void decrypt() {
        String url = encryptor.decrypt("Va4TJO3......=");
        String username = encryptor.decrypt("hL8Ii......g");
        String pwd = encryptor.decrypt("KkKK......e0bSLw");
        System.out.println("url = " + url);
        System.out.println("username = " + username);
        System.out.println("pwd = " + pwd);
    }
}

4、替换数据库密码,ENC()为固定格式,()里面为加密后的密钥

yml 复制代码
spring:
    datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        druid:
            driver-class-name: com.mysql.cj.jdbc.Driver
            url: ENC(WIFxYiNZ......)
            username: ENC(x2354......)
            password: ENC(VNtd8sAx......)
   redis:
        #single单机 sentinel哨兵
        mode: single
        host: ip
        port: 6379
        password: ENC(IyOYR......)
        database: 1
        timeout: 3000
            

5、启动测试

sh 复制代码
# 将盐值放在启动参数中
$ java -jar jasypt-demo.jar --jasypt.encryptor.password=密钥

# 将盐值放在命令行参数中
$ java -Djasypt.encryptor.password=密钥 -jar jasypt-demo.jar

# 也可以将盐值放在系统环境变量中,此处不再展示

6、至此,配置完成,特别需要注意的是密钥千万不要泄露

相关推荐
澈2073 分钟前
C++并查集:高效解决连通性问题
java·c++·算法
易安说AI3 分钟前
Codex 直接住进 JetBrains IDE 里:AI Agent 正在接管熟悉的开发入口
后端
子兮曰1 小时前
Node.js v26.1.0 深度解读:FFI、后量子密码与调试器的进化
前端·后端·node.js
2401_873479402 小时前
运营活动被薅羊毛怎么防?用IP查询+设备指纹联动封堵漏洞
java·网络·tcp/ip·github
ShiJiuD6668889992 小时前
大事件板块一
java
摇滚侠2 小时前
@Autowired 和 @Resource 的区别
java·开发语言
Wy_编程2 小时前
go语言中的结构体
开发语言·后端·golang
SeaTunnel2 小时前
(八)收官篇 | 数据平台最后一公里:数据集成开发设计与上线治理实战
java·大数据·开发语言·白鲸开源
Ting-yu3 小时前
SpringCloud快速入门(7)---- 数据隔离
spring boot·spring·spring cloud
吴声子夜歌3 小时前
Java——线程的基本协作机制
java·线程协作