数据库配置加密(自定义加密方式)

news/2024/11/17 1:26:59/

1. 首先,自己编写加密工具类,我这里使用的是国密(免得其他地方有要求),并使用hutool工具,需要应入pom

package com.banyoyo.epdb.utils;import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.symmetric.SymmetricCrypto;/*** @ClassName SM4Utils* @Description TODO* @Author Banyoyo* @Date 2024/4/18 9:50*/
public class SM4Utils {//key必须是16字节,即128位final static String key = "abcdefghabcdefgh";//指明加密算法和秘钥static SymmetricCrypto sm4 = new SymmetricCrypto("SM4/ECB/PKCS5Padding", key.getBytes());/*** 加密为16进制,也可以加密成base64/字节数组** @param plaintext* @return*/public static String encryptSm4(String plaintext) {if (StrUtil.isBlank(plaintext)) {return "";}return sm4.encryptHex(plaintext, CharsetUtil.CHARSET_UTF_8);}/*** 解密** @param ciphertext* @return*/public static String decryptSm4(String ciphertext) {if (StrUtil.isBlank(ciphertext)) {return "";}return sm4.decryptStr(ciphertext,CharsetUtil.CHARSET_UTF_8);}public static void main(String[] args) {String url="jdbc:mysql://localhost:3306/ep?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true";String username="root";String password="123456";String urlstr =  SM4Utils.encryptSm4(url);String usernamestr =  SM4Utils.encryptSm4(username);String passwordstr =  SM4Utils.encryptSm4(password);System.out.println("加密后的urlstr字符串为"+urlstr);System.out.println("加密后的usernamestr字符串为"+usernamestr);System.out.println("加密后的passwordstr字符串为"+passwordstr);System.out.println("解密后的urlstr字符串为"+SM4Utils.decryptSm4(urlstr));System.out.println("解密后的usernamestr字符串为"+SM4Utils.decryptSm4(usernamestr));System.out.println("解密后的passwordstr字符串为"+SM4Utils.decryptSm4(passwordstr));}
}

打印结果: 

加密后的urlstr字符串为55cefb31b2a805c71443be1a7e0c5b01aa899256121fdd1af5f098f1c1d8ed4bd0aa7fabb91bb9e204596e2522b1aa87486cc60fd45dc64f2d8b01adb3df80e459807cbce9b50eb68ddccc8af042dde5aa39ca7398e97efb662498c641a788809d7efd6414314db6dab13609eb473384f3e15a53efeff4e0c7d1707a0ac2a967497f93f37dc229ebce4bf8963cd91a631ed8218197be5654fce709d7b6fe25cb
加密后的usernamestr字符串为c9fd389f247df4eacaff9693735ac1c5
加密后的passwordstr字符串为951fd163e9d0894fec3d1dac43a2deb8
解密后的urlstr字符串为jdbc:mysql://localhost:3306/ep?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
解密后的usernamestr字符串为root
解密后的passwordstr字符串为123456

2.读取配置,并且解密返回

        数据库配置在spring.datasource下还是spring.datasource.druid下都能读取得到

package com.banyoyo.epdb.config.dataSource;import cn.hutool.db.ds.DataSourceWrapper;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceWrapper;
import com.ambition.epdb.utils.SM4Utils;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @ClassName DataSourceConfig* @Description TODO* @Author banyoyo* @Date 2024/4/16 16:21  DataSourceProperties*/
@Configuration
public class DruidDataSourceConfig extends DruidDataSourceWrapper {@Bean(value = "druidDataSource")public void druidDataSource() {String url = getUrl();System.out.println("Druid: "+url);setUrl(SM4Utils.decryptSm4(url));String username = getUsername();System.out.println("Druid: "+username);setUsername(SM4Utils.decryptSm4(username));String password = getPassword();System.out.println("Druid: "+password);setPassword(SM4Utils.decryptSm4(password));}
}

3.dynamic-datasource多数据源(主要还是继承DynamicDataSourceProperties )

@Configuration
@Qualifier("myDataSourceConfig")
@Primary
public class DataSourceConfig extends DynamicDataSourceProperties {@Autowiredprivate Environment env;@Beanpublic DynamicDataSourceProvider  handleData() throws Exception{Map<String, DataSourceProperty> datasource = getDatasource();DataSourceProperty dbone= datasource.get("dbone");String username = env.getProperty("spring.datasource.dynamic.datasource.dbone.username");String password = env.getProperty("spring.datasource.dynamic.datasource.dbone.password");String key= env.getProperty("key");dbone.setUsername(SymmetricEncoderUtils.decrypt(username, key));dbone.setPassword(SymmetricEncoderUtils.decrypt(password, key));datasource.put("dbone",dbone);return new YmlDynamicDataSourceProvider(datasource);}}

 


http://www.ppmy.cn/news/1423047.html

相关文章

成为程序员的收获、体会与未来展望

在当今数字化时代&#xff0c;程序员的角色变得越来越重要。成为一名程序员不仅仅是学习编程语言和技术&#xff0c;更是一个充满挑战和机遇的职业选择。在本文中&#xff0c;我们将探讨成为程序员后所带来的收获和体会&#xff0c;并展望未来的发展前景。第一部分&#xff1a;…

python re.split()函数解析

re.split简单的使用方法&#xff1a; resultre.split(表达式,字符串,re.S)根据表达式拆分字符串并返回数组 如果拆分文本&#xff0c;比如拆分一本小说内容如下 ss第一章 第一章标题\n fadfasdfasdfadafd\n 第二章 第二章标题\n adfafdasdfasdfadsfasd\n 第三章 第三章…

4.16作业

1.总结keil5下载代码和编译代码需要注意的事项 一、在编译代码时需要先点击魔术棒点击 修改flash Downlond 和pack 二、可以通过F12转跳到对应的函数中&#xff0c;查看函数的原型 三、注释出现乱码通过 Edit中的中的来修改 四、要先bulid在load 2.总结STM32Cubemx的使用方…

力扣1144---递减元素使数组呈锯齿状(Java、Python、模拟)

目录 题目描述&#xff1a; 思路描述&#xff1a; 代码&#xff1a; Java&#xff1a; Python&#xff1a; 题目描述&#xff1a; 给你一个整数数组 nums&#xff0c;每次 操作 会从中选择一个元素并 将该元素的值减少 1。 如果符合下列情况之一&#xff0c;则数组 A 就是 …

Go中的HTTP请求处理概述

使用 Go 处理 HTTP 请求主要涉及两件事&#xff1a;ServeMuxes 和 Handlers。 ServeMux本质上是一个 HTTP 请求路由器&#xff08;或多路复用器&#xff09;。它将传入的请求与预定义的 URL 路径列表进行比较&#xff0c;并在找到匹配时调用路径的关联 handler。 handler 负责写…

Python连接Oracle数据库问题解决及Linux服务器操作知识

背景说明 最近在做一个视频分析的项目&#xff0c;然后需要将视频分析的数据写入到oracle数据库&#xff0c;直接在服务器上测试数据库连接的时候出现了这个bug提示&#xff0c;自己通过不断的研究探讨&#xff0c;最终把这个问题成功进行了解决&#xff0c;在这里进行一下记录…

芯片的未来发展趋势

2024 年&#xff0c;该行业将专注于 AI/ML、RISC-V、量子、安全等发展趋势。 今年年初&#xff0c;大多数人从未听说过生成式人工智能。现在整个世界都在竞相利用它&#xff0c;而这仅仅是个开始。量子计算、6G、智能基础设施等新市场领域专用处理正在加速对更快、更高效、更多…

Linux学习之路 -- PCB介绍 -- 进程优先级

1、什么是优先级&#xff1f; 进程需要某一种资源&#xff0c;而系统要通过特定的方式来决定谁先获得这些资源&#xff0c;而系统的做法就是给不同的进程安排不同的优先级。让优先级高的进程先享有一些资源。 2、为什么要有优先级 因为资源的缺乏&#xff0c;所以系统的才会…