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

news2024/9/24 19:23:52

引言

在业务系统构建与部署的环节中,数据库作为核心存储组件,其连接信息的安全至关重要。通常情况下,这些敏感信息,如数据库密码,会直接以明文形式存储在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 {
 
    @Override
    public String getUsername() {
        // 对用户名进行解密
        return SM4Utils.decryptStr(super.getUsername());
    }
 
    @Override
    public String getPassword() {
        // 对密码进行解密
        return SM4Utils.decryptStr(super.getPassword());
    }
}
2.修改数据库配置
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/uid
    username: '@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.coloradmin.cn/o/2078040.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用EA和SysML一步步建模的操作指南(01)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 对于许多学习SysML和MBSE的同学来说&#xff0c;比较头痛的问题之一是&#xff1a;各种各样的教程里给出的案例&#xff0c;图都是画好了的&#xff01;如何从零开始用建模工具把模型画…

【企业级】像素流管理平台 V1.0

在当今快速发展的数字世界里&#xff0c;虚幻引擎的像素流技术为用户带来了前所未未有的视觉体验和交互方式。为了进一步提升开发效率和用户体验&#xff0c;我们【企业级】像素流管理平台 V1.0应运而生。通过一系列精心设计的功能&#xff0c;这个平台不仅简化了开发流程&…

解锁流量密码!财谷通助力抖音小店优势最大化!

在数字经济蓬勃发展的今天&#xff0c;电商平台如雨后春笋般涌现&#xff0c;其中&#xff0c;抖音小店以其独特的短视频直播模式&#xff0c;成为了众多商家和消费者青睐的新宠。而提及四川财谷通信息技术有限公司在抖音平台上开设的小店&#xff0c;其可靠性更是备受瞩目。本…

初识AOP

Spring有两个核心的概念&#xff0c;一个是IOC/DI&#xff0c;一个是AOP。 AOP是在不改原有代码的前提下对其进行增强。 对于下面的内容&#xff0c;我们主要就是围绕着这一句话进行展开学习&#xff0c;主要学习两方面内容AOP核心概念,AOP作用: 1 什么是AOP? AOP(Aspect O…

【2024】10个好用的AI搜索引擎大盘点

在2024年&#xff0c;随着人工智能技术的飞速发展&#xff0c;AI搜索引擎已经成为我们日常生活中不可或缺的一部分。这些基于人工智能技术的搜索引擎不仅提供了更快速、更准确的搜索体验&#xff0c;还通过自然语言处理&#xff08;NLP&#xff09;和机器学习&#xff08;ML&am…

ECharts tooltip默认html样式,保留样式只对数据数值格式化

之前遇到过需要对数据进行百分比展示&#xff0c;echarts提供的默认样式还是挺好的所以想保留样式&#xff0c;但是设置了formatter默认样式就没了&#xff0c;所以写了formatter的html字符串模拟还原了一下默认样式&#xff0c;在此记录和分享。 适用场景&#xff1a;对数据进…

Datawhale X 李宏毅苹果书 AI夏令营 task1

3.1 局部极小值与鞍点 在深度学习的优化过程中&#xff0c;模型的损失函数可能会在某些点处停止下降&#xff0c;即使我们希望进一步降低损失。这一章节探讨了导致这一现象的原因&#xff0c;包括局部极小值、鞍点&#xff0c;以及其他临界点。理解这些概念能够帮助优化神经网…

注册资本登记新规14问

2023年12月29日修订的《公司法》第四十七条规定&#xff0c;全体股东认缴的出资额由股东按照公司章程的规定自公司注册成立之日起五年内缴足。根据这个规定&#xff0c;存量公司注册资本缴纳期限如何调整还需要进一步明确规定。 就在新公司法正式实施的同一天&#xff0c;2024…

AI新格式超越SD,更轻更快的Flux

随着《黑神话悟空》的横空出世&#xff0c;全民“天命人”大杀四方。 与此同时&#xff0c;AI绘画大模型领域也是群雄逐鹿。 Stable Diffusion作为开源AI绘画大模型鼻祖&#xff0c;推出了SD3&#xff0c;但因为加入了对身体的限制&#xff08;防止涩涩&#xff09;&#xff…

【架构-24】XML和JSON

XML&#xff08;可扩展标记语言&#xff09;和JSON&#xff08;JavaScript对象表示法&#xff09;是两种常用的数据格式&#xff0c;用于在不同系统之间传输和交换数据。它们各有优点和缺点&#xff0c;适用于不同的场景。下面是对XML和JSON的简要介绍以及它们之间的对比。 XM…

武汉流星汇聚:亚马逊第二季度业绩斐然,第三季度展望充满积极动能

在全球电商与科技巨头竞相角逐的舞台上&#xff0c;亚马逊再次以亮眼的财报数据证明了其行业领导者的地位。近日&#xff0c;亚马逊公布的2024财年第二季度财报不仅彰显了公司在复杂经济环境下的稳健增长能力&#xff0c;更为投资者和消费者描绘了一幅充满希望的未来图景。 第…

Mac 笔记本折腾mac windows Linux 三系统(全网独一份)

1.正常安装 mac 可以使用启动盘或者在线恢复 按下并松开电源按钮以将Mac 开机&#xff0c;松开电源按钮按 Option-Command-R 安装最新软件 将整个盘进行抹掉安装&#xff0c;为后面安装windows 进行准备 2.bootcamp 安装 win11&#xff0c;选择系统镜像&#xff0c;我这里最新…

STM32(F103ZET6)第六课:定时器

目录 定时器需求一、系统滴答定时器1.配置流程2.程序配置 二、基本定时器1.TIM6定时器配置1.时钟源使能2.分频器3.装载值4.计数器使能5.打开定时器中断并配置6.中断函数编写 三、通用定时器TIM2 定时器需求 1.使用系统滴答定时器实现LED灯的翻转&#xff08;0.5s翻转一次&…

变压器涌流浪涌

涌流和浪涌 1. 相关概念简介 涌流 基本概念及分析意义&#xff1a; 涌流基本概念&#xff1a;指在断电或重新通电后&#xff0c;瞬时大电流从电源流向负载的现象。 在电力系统中&#xff0c;涌流的出现与许多因素有关&#xff0c;例如电源电压、负载电容和电感等&#xff…

uniapp环境H5运行及发行(入门必学)

uniapp环境H5运行及发行 Uni-app是一个使用Vue.js开发所有前端应用的框架&#xff0c;它可以编译到iOS、Android、H5、以及各种小程序等多个平台。关于Uni-app环境下H5的运行及发行&#xff0c;以下是详细的步骤和注意事项&#xff1a; 一、H5运行 安装环境 安装Node.js&…

【案例60】NIO导致本地内存溢出

问题现象 集成环境出现宕机&#xff0c;javacore中报本地内存溢出。 问题分析 对JAVACORE进行分析之后可以发现&#xff0c;有大量的异步IO线程。 同时查看websphere的ffdc事件可以发现&#xff1a; 从FFDC中可以看到部分信息&#xff1a; com.ibm.ws.util.ThreadPool$Wor…

源代码编译,Apache DolphinScheduler前后端分离部署解决方案

转载自神龙大侠 生产环境部署方案 在企业线上生产环境中&#xff0c;普遍的做法是至少实施两套环境。 测试环境线上环境 测试环境用于验证代码的正确性&#xff0c;当测试环境验证ok后才会部署线上环境。 鉴于CI/CD应用的普遍性&#xff0c;源代码一键部署是必要的。 本文…

ISO 26262中的失效率计算:SN 29500-2 Expected values for integrated circuits

目录 概要 1 基准条件下的失效率 2 失效率转换 2.1 失效率预测模型 2.2 电压应力系数 2.2.1 电压应力系数计算模型 2.2.2 电压应力系数计算 2.3 温度应力系数 2.3.1 温度应力系数计算模型 2.3.2 温度应力系数计算 2.4 漂移灵敏度系数 3 任务剖面应力系数 4 早期失…

JAVA设计模式之【原型模式】

快速构建对象方法&#xff1a; 使用简单工厂将get&#xff0c;set封装到某个方法中&#xff08;Client类&#xff09; JDK提供实现Cloneable接口实现快速复制 1 类图 2 适用场景 1、类初始化消耗资源较多。 2、new 产生的一个对象需要非常繁琐的过程&#xff08;数据准备、访…

Python selenium爬虫被检测到,该怎么破?

当使用Selenium进行网络爬虫操作时&#xff0c;经常会被目标网站检测到并采取了反爬措施&#xff0c;有几种方法可以尝试规避。 1、 用无头模式&#xff08;Headless Mode&#xff09;&#xff1a;Selenium支持在无头浏览器模式下运行&#xff0c;这样就不会触发与真实用户操作…