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

Java使用国密算法 *** sm3 摘要签名算法/*** str重复执行sm3签名后的值 是相同的} }测试结果可以看出SM3摘要签名算法 是可以重复执行,且多次执行结果一致的。需要注意的是SM3 算法是不可逆的,只能从原文得到摘要签名,不能从摘要签名 反向得到原文,这一点和MD5算法是相似的。 阅读详情
AI摘要

本文介绍了如何在SpringBoot应用中使用SM4算法对数据库配置信息进行加密和解密,以保护敏感数据安全,包括引入依赖、编写加密解密工具类、自定义数据源和使用Jasypt扩展至所有配置属性加密。

一、前言

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

二、SM4算法

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

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

SM4:SM4百科

在这里插入图片描述

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

1. 导入相关加解密依赖

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

注意:字符串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);
    
  • 测试结果

    在这里插入图片描述

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

1. 修改数据库配置信息

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

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

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

在这里插入图片描述

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的DataSource类即可。

4. 启动测试

在这里插入图片描述

启动不报错,业务正常,改造完成。

四、扩展——支持对所有配置属性加解密

针对上述对数据库加解密思路可以发现,这套逻辑也适用于针对spring boot所有属性的读取。

1. 导入jasypt-spring-boot-starter依赖

Jasypt为Spring Boot应用提供property sources的加密支持。

<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>3.0.5</version>
</dependency>

2. 自定义加密属性探测器实现

package com.learn.pro;

import com.learn.util.SM4Utils;
import com.ulisesbocchio.jasyptspringboot.EncryptablePropertyDetector;

public class MyEncryptablePropertyDetector implements EncryptablePropertyDetector {

    /**
     * 判断是否是需要解密的字符串
     *
     * @param s
     * @return
     */
    @Override
    public boolean isEncrypted(String s) {
        if (s != null) {
            return s.startsWith(SM4Utils.SM4_PREFIX); // 判断是否有SM4加密标识
        }
        return false;
    }

    /**
     * 获取截取掉加密标识以后的字符串
     *
     * @param s
     * @return
     */
    @Override
    public String unwrapEncryptedValue(String s) {
        return s.substring(SM4Utils.SM4_PREFIX.length());
    }
}

3. 自定义密码解析器

package com.learn.pro;

import com.learn.util.SM4Utils;
import com.ulisesbocchio.jasyptspringboot.EncryptablePropertyResolver;

public class MyEncryptablePropertyResolver implements EncryptablePropertyResolver {

    private MyEncryptablePropertyDetector encryptablePropertyDetector;

    public MyEncryptablePropertyResolver(MyEncryptablePropertyDetector encryptablePropertyDetector) {
        this.encryptablePropertyDetector = encryptablePropertyDetector;
    }

    @Override
    public String resolvePropertyValue(String s) {
        /**
         * 判断是否需要解密,如果需要解密则返回解密以后的值
         */
        if (encryptablePropertyDetector.isEncrypted(s)) {
            return SM4Utils.decryptStr(s);
        }
        return s;
    }
}

4. 自定义装配类生效

package com.learn.pro;

import com.ulisesbocchio.jasyptspringboot.EncryptablePropertyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyJasyptConfig {

    @Bean
    public MyEncryptablePropertyDetector encryptablePropertyDetector() {
        return new MyEncryptablePropertyDetector();
    }

    @Bean
    public EncryptablePropertyResolver encryptablePropertyResolver() {
        return new MyEncryptablePropertyResolver(encryptablePropertyDetector());
    }

}

5. 测试

我们这里自定义一个属性,进行加密测试,加密信息的生成需要使用我们自定义的SM4Utils工具类:

sm4:
  test: "@SM4@-1LnppEtMiTgGtTJ4shhYMg=="  # SM4Utils.encryptStr("hello, SM4!")

测试代码:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import javax.annotation.PostConstruct;

@SpringBootApplication
public class DemoApplication {

    @Value("${sm4.test}")
    private String sm4Test;

    private static DemoApplication demoApplication;

    @PostConstruct
    public void init() {
        demoApplication = this;
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);

        System.out.println("\n获取属性sm4.test = "+ demoApplication.sm4Test);
    }

}

测试结果:

在这里插入图片描述

到此,一个通用的spring boot配置文件加密,默认解密功能就完成啦。

Java 针对JT/T808国密SM4加解密处理 一、前言 应国企客户要求,针对产品上行到平台的数据以及对平台下行到设备的数据进行国密SM4进行加解密,对此进行了SM4加密的理解与封装 二、踩坑 坑一:密钥大于16个字节 当秘钥长度超过16字符(即128位)时会加密失败,报“java.security.InvalidKeyException: Illegal key size or default parameters”的异常 这是因为美国对出口软件的控制,如果想移除这个限制需要修改Java环境!而且每个Java环境对这个限制修改还可能不一样! 阅读详情

相关推荐

Spring Boot配置加密进阶:基于Jasypt与Hutool的SM4国密算法融合方案

在软件工程实践中,配置加密是保障应用安全性的基础环节,其核心原理在于对敏感信息进行加密存储,防止明文泄露。Jasypt作为Spring Boot生态中成熟的配置加密库,提供了便捷的集成方式,而国密算法SM4则因其符合国家密码标准,在特定行业场景中具有重要的技术价值。本文将探讨如何将Hutool工具库提供的SM4算法实现,无缝集成到Jasypt的解密流程中,构建一个既安全又易于管理的配置加密方案。该方案适用于对数据安全有较高要求,特别是需要遵循国密标准的Spring Boot项目,实现了从通用加密到国密加密的

weixin_33831673的博客 457

HDU密码学-SM4(Java实现,仅针对输入为16进制128bit的明文和密钥)

一、实验名称:SM4密码实验 二、实验要求: 1、熟悉分组密码的基本框架。 2、掌握SM4密码的加解密原理。 3、用合适的编程语言实现SM4密码程序并输出结果。 三、实验内容: SM4算法是我国商用密码标准,其前身是SMS4算法。SM4算法是一个分组加密算法,分组长度和密钥长度均128bit。SM4算法使用32轮的非线性迭代结构。SM4在最后一轮非线性迭代之后加上了一个反序变换,因此SM4中只要解密密钥是加密密钥的逆序,它的解密算法与加密算法就可以保持一致。SM4的主体运算是非平衡Feistel网络。整体逻

weixin_51255909的博客 1万+

告别明文配置!Spring Boot整合Jasypt与国密SM4,实现yaml敏感信息自动解密

本文详细介绍了Spring Boot如何整合Jasypt与国密SM4算法,实现yaml配置文件中敏感信息的自动解密。通过非侵入式设计,解决了传统加密方案侵入性强、维护困难的问题,同时符合等保2.0要求,适用于数据库连接等敏感配置的安全管理。

weixin_30536513的博客 504

sm4前后端加密集成

【代码】sm4前后端加密集成。

u013008898的博客 8815

Spring Boot配置文件加密实战:基于Jasypt的YAML敏感信息保护方案

在企业级应用开发中,配置管理是保障系统安全的重要环节。配置文件作为应用的核心信息载体,常包含数据库连接、API密钥等敏感数据,其明文存储会带来严重的安全风险。从技术原理层面,对称加密(如AES)和非对称加密(如RSA)是保护敏感信息的两种主要手段,前者适合大量数据的快速加解密,后者则在密钥安全分发方面更具优势。在实际工程实践中,结合两者优势的混合加密模式常被采用,即用对称加密算法处理配置值,再用非对称加密保护对称密钥。这种方案的技术价值在于,它能在不显著影响性能的前提下,为配置信息提供端到端的保护,有效防止

weixin_33924770的博客 412

Spring Boot集成国密SM4加密Nacos配置,替换Jasypt实现安全升级

在微服务架构中,配置中心的安全管理是保障应用安全的重要环节。其核心原理在于对敏感配置信息进行加密存储与传输,防止明文泄露。采用符合国家密码标准的国密算法进行加密,不仅能提升技术合规性,还能有效应对日益严格的数据安全规范。从技术价值看,这实现了对业务代码的零侵入式安全加固,尤其适用于金融、政务等对数据安全有高要求的场景。本文聚焦于Spring Boot项目,通过自定义Jasypt的StringEncryptor,集成Bouncy Castle库提供的SM4算法引擎,实现对Nacos配置中心中数据库密码等敏感项

benben 374

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

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

八戒的博客 3508

Spring Boot多数据源密码加密:SM4国密算法与EnvironmentPostProcessor实战

在微服务架构中,配置安全是防线的重要一环。数据库密码等敏感信息若以明文存储在配置文件或配置中心,一旦泄露极易引发拖库风险。本文从配置安全的基础概念出发,阐述如何在 Spring Boot 应用启动早期,利用 EnvironmentPostProcessor 扩展点对数据源密码进行无感解密。通过引入国密 SM4 算法,结合 dynamic-datasource 多数据源框架,实现配置文件中仅保留密文,且业务代码零侵入。该方案不仅解决多环境密钥管理混乱问题,还满足金融政务场景的国产化合规要求。文章中详细拆解了

weixin_33834137的博客 585

Spring Boot配置加密实战:基于SM4国密算法实现敏感信息自动解密

在应用开发中,配置管理是基础且关键的环节,尤其是涉及数据库密码、API密钥等敏感信息时,明文存储会带来严重的安全风险。其核心原理在于通过加密算法对敏感配置进行转换,确保即使配置文件泄露,攻击者也无法直接获取原始信息。这项技术的价值在于实现了安全性与开发便利性的平衡,它通过对Spring Boot配置加载机制的扩展,在属性注入前自动完成解密,对业务代码完全透明。典型的应用场景包括金融、政务等对数据安全与合规性有严格要求的领域,这些场景往往要求使用国密算法。本文将以**SM4国密算法**和**Spring Bo

421

SpringBoot集成国密SM4加密配置:从依赖冲突到YAML格式的实战避坑指南

在软件工程实践中,配置信息加密是保障应用安全的基础环节,其核心原理在于通过密码学算法对敏感数据进行转换,防止明文泄露。Jasypt作为Java领域广泛使用的加密库,通过与SpringBoot集成,为配置文件提供了便捷的加密解密能力,其技术价值在于实现了安全性与开发便利性的平衡。在实际应用场景中,开发者常面临算法选型、依赖管理、配置解析等具体问题。本文聚焦于使用国密SM4算法替代默认算法进行配置加密时遇到的典型挑战,例如**依赖冲突**导致的安全提供者注册失败,以及**YAML格式**中空格对属性占位符解析的

weixin_33859231的博客 408

Spring Boot动态数据源配置加密:基于EnvironmentPostProcessor的自定义解密方案

在Spring Boot企业级应用中,数据源配置管理是保障应用安全的关键环节。动态数据源(Dynamic-Datasource)作为多数据源场景的常用解决方案,其配置文件中的数据库连接信息(如密码、URL)往往包含敏感数据。传统的明文存储方式存在安全风险,而通用加密工具如Jasypt有时无法满足特定架构或算法要求。本文从Spring Boot的Environment机制切入,深入解析如何通过实现EnvironmentPostProcessor接口,在配置加载阶段植入自定义解密逻辑。该方案采用AES-GCM等

蓝色妖姬 493

Spring Boot多数据源SM4加密密码与自动解密实战

在微服务与多数据源架构中,数据库连接串常以明文形式存放在配置文件中,容易导致口令泄露和审计不通过。针对这一痛点,可选用国密标准SM4对称加密算法,结合Spring Boot动态数据源扩展机制,在不侵入业务代码的前提下实现密码安全存储与自动解密。核心原理是自定义DynamicDataSourceProvider,在数据源创建前拦截DataSourceProperty,识别并解密带有ENC()标记的密文,同时移除默认Provider以避免重复创建。该方案兼顾合规要求与工程可维护性,适用于等保整改、多数据源改造、

weixin_29273849的博客 236

告别纯MD5/AES:手把手教你为 ShardingSphere 5.x 集成国密SM4数据脱敏策略

本文详细介绍了如何在ShardingSphere 5.x中集成国密SM4数据脱敏策略,从SPI扩展、性能调优到灰度迁移的全流程实践。通过对比AES与SM4的性能差异,提供优化建议,并展示如何在Spring Boot项目中配置SM4加密器,满足金融级数据安全需求。

weixin_30919429的博客 504

Spring Boot配置加密实战:基于SM4算法实现敏感信息安全管理

在软件工程实践中,配置管理是保障应用安全的关键环节。传统的硬编码或明文存储敏感信息(如数据库密码、API密钥)存在严重的安全风险,一旦泄露将直接威胁系统安全。其核心原理在于通过加密算法对敏感配置进行转换,确保即使配置文件被非法访问,攻击者也无法直接获取原始信息。这一技术的核心价值在于实现安全性与便利性的平衡,为应用构建一道透明的安全防线。常见的应用场景包括金融、电商等对数据安全要求较高的行业系统。本文聚焦于Spring Boot框架,深入探讨如何利用国密SM4算法实现配置项的自动加解密,并结合密钥管理策略,

weixin_33826609的博客 450

我的Android进阶之旅------>解决AES加密报错:java.security.InvalidKeyException: Unsupported key size: 18 bytes

摘要: 在使用AES加密时出现InvalidKeyException错误,提示密钥长度18字节不匹配。AES算法支持128位(16字节)、192位(24字节)和256位(32字节)三种密钥长度。项目中采用AES128算法,但使用了18字节密钥导致报错。解决方法是将密钥调整为16字节,与AES128算法要求一致。密钥长度必须严格对应算法标准,否则会引发兼容性问题。可通过参考AES算法原理进一步理解密钥长度的规范要求。

字节卷动 1万+

SpringBoot开发——集成国密SM4加密算法

SpringBoot集成国密SM4加密算法

bjzhang75的博客 2112
上一篇: 关于TDSQL(MySQL)的简单知识分享
下一篇: nacos安装手册
Coder-文小白
博客等级 码龄10年 9191粉丝 142原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coder-文小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值