SpringBoot实战:Spring Boot项目使用SM4国密加密算法

引言

在业务系统构建与部署的环节中,数据库作为核心存储组件,其连接信息的安全至关重要。通常情况下,这些敏感信息,如数据库密码,会直接以明文形式存储在YAML配置文件中,这无疑增加了信息泄露的风险。为有效应对这一挑战,我们可以采取一种安全措施:即在配置数据库密码时先对其进行加密处理,而在应用程序读取时则进行相应的解密操作。这样的处理方式能够有效屏蔽敏感信息,显著降低信息泄露的风险,从而确保数据库连接信息的安全性。

一、什么是SM4算法

        目前市面上流行的加密算法有很多,接下来本文将介绍国密加密算法 SM4进行介绍。

SM4国密算法:是一种分组对接的加密算法。

二、项目集成加密算法

1.在 pom.xml 文件添加国密算法依赖

<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15to18</artifactId><version>1.76</version>
</dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.25</version>
</dependency>

2.编写加密工具类

import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.symmetric.SM4;public class SM4Utils {/*** SM4是对称加密,需要设置一个加解密秘钥* <p>* System.out.println(Arrays.toString("@Jhx2024#$%^&*!+".getBytes(StandardCharsets.UTF_8)));* 特别注意字符串key的长度需要16位*/private static final byte[] keys = new byte[]{64, 74, 104, 120, 50, 48, 50, 52, 35, 36, 37, 94, 38, 42, 33, 43};/*** 创建一个SM4加解密对象*/private static final SM4 sm4 = SmUtil.sm4(keys);/*** 设置一个标识符,标识@SM4@- 开头的字符串是经过SM4加密的需要解密*/public static final String SM4_PREFIX = "@SM4@-";/*** 对字符串进行加密** @param value* @return*/public static String encryptStr(String value) {// 对加密的字符串添加前缀,方便标识这是一个加密以后的字符串return SM4_PREFIX + sm4.encryptBase64(value);}/*** 对字符串进行解密** @param encryptValue* @return*/public static String decryptStr(String encryptValue) {// 解密时,需要去除加密标识符return encryptValue.startsWith(SM4_PREFIX) ? sm4.decryptStr(encryptValue.substring(SM4_PREFIX.length())) : encryptValue;}
}

3.SM4工具类测试

String str = "hello, world";
System.out.println("原始字符串: " + str);
str = SM4Utils.encryptStr(str);
System.out.println("经过SM4默认密钥加密字符串: " + str);
str = SM4Utils.decryptStr(str);
System.out.println("经过SM4默认密钥解密字符串: " + str);

测试结果

4. 对数据库配置信息进行加解密

1. 修改数据库配置信息

对数据库配置信息进行加密,加密信息的生成需要使用我们自定义的SM4Utils工具类

自定义数据源解密

针对加密的数据库配置信息,需要自定义解密,所以需要自定义一个DataSource对象

import com.learn.util.SM4Utils;
import com.zaxxer.hikari.HikariDataSource;public class MyHikariDataSource extends HikariDataSource {@Overridepublic String getUsername() {// 对用户名进行解密return SM4Utils.decryptStr(super.getUsername());}@Overridepublic String getPassword() {// 对密码进行解密return SM4Utils.decryptStr(super.getPassword());}
}
2.修改数据库配置
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/uidusername: '@SM4@-tWyNqklSTiV5W3gN4dTQ2g==' # 经过SM4Utils.encryptStr方法加密password: '@SM4@-tWyNqklSTiV5W3gN4dTQ2g==' # 经过SM4Utils.encryptStr方法加密type: com.learn.db.MyHikariDataSource # 指定自定义的DataSource类

总结:

在Spring Boot项目中,当使用默认的数据源HikariDataSource时,若需自定义数据源配置,可以通过继承HikariDataSource类来实现个性化的数据源设置。同样地,如果项目选择使用Druid作为数据源,那么自定义数据源时则应当继承DruidDataSource类以满足特定的配置需求。因此,原话可以修改为:

在Spring Boot项目中,若采用默认的HikariDataSource作为数据源,为了实现自定义的数据源配置,可以通过扩展HikariDataSource类来完成。相应地,如果项目偏好使用Druid数据源,那么自定义数据源配置时,则应当通过继承DruidDataSource类来灵活调整数据源的各项参数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/414389.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

活动系统开发之采用设计模式与非设计模式的区别-需求整理

用户需求(活动系统)&#xff1a; 1、活动类型&#xff1a;答题、图片展示、签到、抽奖、组团等活动 2、活动介绍&#xff1a; a、答题活动&#xff1a; 第一种是签到后&#xff0c;随机抽取10道题&#xff0c;答对8到就可以抽奖&#xff1b; 第二种是随机抽取一道题&#xff0…

Call openai-node in the backend or call https in the frontend?

题意&#xff1a;在后端调用 openai-node 还是在前端调用 https&#xff1f; 问题背景&#xff1a; I have a web application by ReactJS and Nodejs. This application calls OpenAI APIs. 我有一个使用 ReactJS 和 Node.js 开发的 Web 应用程序。这个应用程序调用 OpenAI …

UE5开发——射击武器类拾取

整体框架&#xff1a; 拾取武器 要在 Unreal Engine 5 (UE5) 中实现一个按 E 键拾取武器的功能&#xff0c;您可以遵循以下步骤&#xff1a; ### 步骤 1: 创建拾取物品的基础类 1. 在 Content Browser 中创建一个新的 C 类&#xff0c;继承自 AActor 或者 AStaticMeshActor。…

串口助手使用和插入usb转TTL的COM口识别问题

问题出现原因 由于串口调试中经常需要通过断电对单片机烧录程序&#xff0c;所以制作了一个转接带开关的USB 转接口&#xff0c;如下图所示&#xff0c;其中按键控制的是OUT口的电源通断。但为了能够数据传输&#xff0c;有两根传输数据的线是一直连接的。在使用usb进行程序烧…

什么是EDR、NDR、MDR、XDR?他们之间什么区别?

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 概述 EDR是什…

ParallelsDesktop19可在任何Mac上运行Windows软件

ParallelsDesktop19是一款Mac虚拟机软件&#xff0c;可在任何Mac上运行Windows&#xff0c;体验不同操作系统之间的无缝集成&#xff0c;并具有创新设计和增强功能&#xff0c;如无密码登录与TouchID、支持macOSSonoma14和增强打印选项。此外&#xff0c;它还支持运行更多Windo…

EasyExcel动态映射Excel数据到任意实体类教程

在使用EasyExcel进行Excel导入时&#xff0c;我们经常需要将Excel中的数据映射到Java实体类中。如果Excel的列名是固定的&#xff0c;我们可以通过ExcelProperty("列名")注解直接在实体类中指定列名。但如果Excel的列名不固定&#xff0c;或者我们希望根据Excel的第一…

【Unity实战】Visual Studio Debug失败

Visual Studio&#xff0c;就像以前Eclipse在Java领域中的地位一样&#xff0c;至少在Jetbrains人人皆爱之前&#xff0c;它是主流。可能对于当下来说显得臃肿&#xff0c;而且没有Jetbrains智能准确的代码分析提示&#xff0c;但是依旧能用。而且开大工程来说&#xff0c;至少…

Kubernetes 网关流量管理:Ingress 与 Gateway API

引言 随着 Kubernetes 在云原生领域的广泛使用&#xff0c;流量管理成为了至关重要的一环。为了有效地管理从外部流入集群的流量&#xff0c;Kubernetes 提供了多种解决方案&#xff0c;其中最常见的是 Ingress 和新兴的 Gateway API。 Ingress 随着微服务架构的发展&#x…

Jupyter如何使用Anaconda的虚拟环境

Anaconda的虚拟环境大家应该都知道是什么&#xff0c;我们可以建立多个虚拟环境并在对应的环境中安装不同的python三方库从而运行不同的python项目&#xff0c;那么在jupyter中如何使用Anaconda的虚拟环境呢&#xff0c;今天就为大家分享一个这样的操作教程。 请参考图文进行以…

实用好软-----电脑端 开源的视频无损剪切与合并工具

这个是一个开源项目LosslessCut 无损剪切就是基于关键帧的剪切&#xff0c;不需要重编码&#xff0c;因此速度非常快&#xff0c; 缺点就是切割时间无法达到非常精确&#xff0c;可能前后会有几秒的差距&#xff0c; 要做到精确的剪切&#xff0c;只能重编码。 LosslessCut在切…

Junit单元测试入门

目录 一、单元测试 1.1 基本概念 1.2 以往测试存在的问题和不足 二、快速入门 2.1 基本步骤 2.2 基本使用示例&#xff08;vscode为例&#xff09; 2.2 断言机制&#xff08;重要&#xff09; 2.3 其它注解 一、单元测试 1.1 基本概念 针对最小单元的测试&#xff0c…

mysql创建数据库和表

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; 一、MySQL数据库和表的基础概念 在深入讲解如何在MySQL中创建数据库和表之前&#xff0c;先了解一些基础概念。 1.1 数据库和表的概念 数据库&#xff08;Database&#xff09;&#xff1a;数据库是数据存…

4-6 使用bios 中断 显示字符

1 显示的逻辑 bios 首先通过中断&#xff0c;访问到 最前面的中断向量表&#xff0c;然后 通过中断向量表然后 访问到具体的 bios 的函数&#xff0c;这些函数是bios 自带的&#xff0c;具体的位置 &#xff0c; 我也不知道。只知道有这个函数。 3 显示的原理 &#xff1b; 主要…

Unity中保存数据的方法

一、概述 Unity中可用于持久化的方式有&#xff1a; 1&#xff09;通过ScriptableObject在可编辑模式下保存数据 2&#xff09;通过excel、json等文件实现数据的可持久化 二、ScriptableObject的使用 1、使用背景 假如需要制作子弹预设体&#xff0c;每个子弹上有speed速…

【国考】特值法

特值法 题干中存在乘除关系&#xff0c;且对应量未知。 例3&#xff1a;甲、乙、丙三个工程队的效率比为6&#xff1a;5&#xff1a;4,现将A、B两项工作量相同的工程交给这三个工程队,甲队负责A工程,乙队负责B工程,丙队参与A工程若干天后转而参与B工程.两项工程同时开工,耗时16…

两个月冲刺软考——求解关系模式达到了第几范式题型(例题+讲解,一看就会)

目录 1.假设一对多联系不转换为一个独立的关系模式的话&#xff0c;那么生成的关系模式应该是将“一”的那一方的主键加入到“多”的一方的关系模式中。 2.求解关系模式达到了第几范式题型 1.假设一对多联系不转换为一个独立的关系模式的话&#xff0c;那么生成的关系模式应该…

利用session.upload_progress执行文件包含

1.session.upload_progress的作用&#xff1a; session.upload_progress最初是PHP为上传进度条设计的一个功能&#xff0c;在上传文件较大的情况下&#xff0c;PHP将进行流式上传&#xff0c;并将进度信息放在Session中&#xff08;包含用户可控的值&#xff09;&#xff0c;即…

excel透视图、看板案例(超详细)

一、简介 Excel透视图&#xff08;Pivot Table&#xff09; 功能&#xff1a;透视图是一种强大的数据分析工具&#xff0c;用于汇总、分析和展示数据。它允许用户对数据进行重新排列和分类&#xff0c;从而更容易发现数据中的模式和趋势。用途&#xff1a;可以用来生成动态报表…

GIT 下载安装使用教程

目录 一. GIT 下载 二. GIT 安装 1. 许可声明 2. 选择安装路径 3. 组件选择 4. 开始菜单文件夹 5. Git使用的默认编辑器 6. 调整新存储库中初始分支的名称 7. 调整Path环境 8. 选择SSH可执行文件 9. 选择HTTPS传输后端 10. 配置行结束转换 11. 配置用于Git Bash的终端模…