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

点击关注公众号,更多资讯及时推送↓

引言


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



一、什么是SM4算

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

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

SpringBoot实战:Spring Boot项目使用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);

测试结果

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

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


原文始发于微信公众号(Java技术前沿):SpringBoot实战:Spring Boot项目使用SM4国密加密算法

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/299604.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!