当前位置: 首页 > news >正文

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类来灵活调整数据源的各项参数。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Qt】多元素控件QTreeWidget
  • 【ShuQiHere】用类来实现LSTM:让你的模型拥有更强的记忆力
  • 区块链知识体系fisco-bcos实战
  • Nature同款富集分析结果条形图叠加基因
  • ros发布图像
  • nacos配置持久化到Mysql数据库
  • Gartner发布2024年应用安全成熟度曲线:26项应用安全最新技术发展及应用状况和趋势
  • 深入解析Python的Pandas库:数据分析的利器(二)
  • 解决STM32使用J-Link可以擦除和读取但是无法烧录问题
  • Linux文件编程(进阶)
  • 每日刷一刷力扣SQL(八)
  • 综合评价 | 基于层次-熵权-变异系数-正态云组合法的综合评价模型(Matlab)
  • java 使用 aws s3 sdk 通过分段下载来实现 html 页面 video 的断点播放、拖动进度播放
  • 小程序面试题一
  • 【SAM下游任务微调】TS-SAM: Fine-Tuning Segment-Anything Model for Downstream Tasks
  • const let
  • Consul Config 使用Git做版本控制的实现
  • extjs4学习之配置
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • java2019面试题北京
  • LintCode 31. partitionArray 数组划分
  • MySQL数据库运维之数据恢复
  • Spring Cloud Feign的两种使用姿势
  • Sublime text 3 3103 注册码
  • 闭包--闭包作用之保存(一)
  • 当SetTimeout遇到了字符串
  • 给Prometheus造假数据的方法
  • 缓存与缓冲
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 说说动画卡顿的解决方案
  • 携程小程序初体验
  • 移动端解决方案学习记录
  • 由插件封装引出的一丢丢思考
  • 怎么将电脑中的声音录制成WAV格式
  • 正则与JS中的正则
  • PostgreSQL之连接数修改
  • ​iOS安全加固方法及实现
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • ### RabbitMQ五种工作模式:
  • #70结构体案例1(导师,学生,成绩)
  • (09)Hive——CTE 公共表达式
  • (8)STL算法之替换
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (面试必看!)锁策略
  • (强烈推荐)移动端音视频从零到上手(上)
  • (转) Android中ViewStub组件使用
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • .DFS.
  • .NET 5种线程安全集合
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .net反编译工具