实战——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、至此,配置完成,特别需要注意的是密钥千万不要泄露

相关推荐
ClearViper319 分钟前
Java的多线程笔记
java·开发语言·笔记
全栈凯哥1 小时前
Java详解LeetCode 热题 100(17):LeetCode 41. 缺失的第一个正数(First Missing Positive)详解
java·算法·leetcode
神经毒素1 小时前
WEB安全--Java安全--LazyMap_CC1利用链
java·开发语言·网络·安全·web安全
逸夕1 小时前
httpclient请求出现403
java
呆呆洁ᵔ·͈༝·͈ᵔ2 小时前
配置集群-日志聚集操作
java·ide·eclipse
阑梦清川2 小时前
关于Go语言的开发环境的搭建
开发语言·后端·golang
lyrhhhhhhhh2 小时前
Spring 模拟转账开发实战
java·后端·spring
banzhenfei2 小时前
xp_cmdshell bcp 导出文件
java·数据库·sql
tonngw2 小时前
【Mac 从 0 到 1 保姆级配置教程 12】- 安装配置万能的编辑器 VSCode 以及常用插件
git·vscode·后端·macos·开源·编辑器·github
带刺的坐椅2 小时前
SpringBoot3 使用 SolonMCP 开发 MCP
java·ai·springboot·solon·mcp