使用SM4国密加密算法对Spring Boot项目数据库连接信息以及yaml文件配置属性进行加密配置(读取时自动解密)

2024-07-11 1776阅读

一、前言

在业务系统开发过程中,我们必不可少的会使用数据库,在应用开发过程中,数据库连接信息往往都是以明文的方式配置到yaml配置文件中的,这样有密码泄露的风险,那么有没有什么方式可以避免呢?方案当然是有的,就是对数据库密码配置的时候进行加密,然后读取的时候再进行解密,这样就可以避免敏感信息泄露了。

二、SM4算法

目前市面上流行的加密算法有很多,本次我们采用国产加密算法SM4进行介绍。

SM4加密算法是一种分组对接加密算法,详细信息可以参考百度百科:

SM4:SM4百科使用SM4国密加密算法对Spring Boot项目数据库连接信息以及yaml文件配置属性进行加密配置(读取时自动解密)

三、数据库配置信息加解密

1. 导入相关加解密依赖
    org.bouncycastle
    bcprov-jdk15to18
    1.76


    cn.hutool
    hutool-all
    5.8.25

2. 编写加解密工具类
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.symmetric.SM4;
public class SM4Utils {
    /**
     * SM4是对称加密,需要设置一个加解密秘钥
     * 

* 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; } }

注意:字符串key的长度需要16位,否则会报错:

Exception in thread "main" cn.hutool.crypto.CryptoException: InvalidKeyException: SM4 requires a 128 bit key
	at cn.hutool.crypto.symmetric.SymmetricCrypto.encrypt(SymmetricCrypto.java:277)
	at cn.hutool.crypto.symmetric.SymmetricEncryptor.encrypt(SymmetricEncryptor.java:139)
	at cn.hutool.crypto.symmetric.SymmetricEncryptor.encryptBase64(SymmetricEncryptor.java:159)
	at com.learn.util.SM4Utils.encryptStr(SM4Utils.java:34)
	at com.learn.SnowFlakeDemoApplication.main(SnowFlakeDemoApplication.java:17)
Caused by: java.security.InvalidKeyException: SM4 requires a 128 bit key
	at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineInit(Unknown Source)
	at javax.crypto.Cipher.init(Cipher.java:1246)
	at javax.crypto.Cipher.init(Cipher.java:1186)
	at cn.hutool.crypto.CipherWrapper.initMode(CipherWrapper.java:116)
	at cn.hutool.crypto.symmetric.SymmetricCrypto.initMode(SymmetricCrypto.java:415)
	at cn.hutool.crypto.symmetric.SymmetricCrypto.encrypt(SymmetricCrypto.java:274)
	... 4 more
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);

测试结果

使用SM4国密加密算法对Spring Boot项目数据库连接信息以及yaml文件配置属性进行加密配置(读取时自动解密)

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

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

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/uid
    username: '@SM4@-tWyNqklSTiV5W3gN4dTQ2g=='
    password: '@SM4@-tWyNqklSTiV5W3gN4dTQ2g=='

此时,启动项目,数据库信息加载时,肯定会报错:

使用SM4国密加密算法对Spring Boot项目数据库连接信息以及yaml文件配置属性进行加密配置(读取时自动解密)

2. 自定义数据源解密

针对加密的数据库配置信息,需要自定义解密,所以需要自定义一个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());
    }
}
3.修改数据库配置
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数据源,所以自定义DataSource继承HikariDataSource类,如果是其他数据源,比如druid数据源,继承Druid的DruidDataSource类即可。

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]