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

相关推荐
qq_4419960517 分钟前
Mybatis官方生成器使用示例
java·mybatis
巨大八爪鱼23 分钟前
XP系统下用mod_jk 1.2.40整合apache2.2.16和tomcat 6.0.29,让apache可以同时访问php和jsp页面
java·tomcat·apache·mod_jk
码上一元2 小时前
SpringBoot自动装配原理解析
java·spring boot·后端
计算机-秋大田2 小时前
基于微信小程序的养老院管理系统的设计与实现,LW+源码+讲解
java·spring boot·微信小程序·小程序·vue
魔道不误砍柴功4 小时前
简单叙述 Spring Boot 启动过程
java·数据库·spring boot
失落的香蕉4 小时前
C语言串讲-2之指针和结构体
java·c语言·开发语言
枫叶_v4 小时前
【SpringBoot】22 Txt、Csv文件的读取和写入
java·spring boot·后端
wclass-zhengge4 小时前
SpringCloud篇(配置中心 - Nacos)
java·spring·spring cloud
路在脚下@4 小时前
Springboot 的Servlet Web 应用、响应式 Web 应用(Reactive)以及非 Web 应用(None)的特点和适用场景
java·spring boot·servlet
黑马师兄4 小时前
SpringBoot
java·spring