Java聚合对外网关,使用国密SM4采用CBC分组填充模式实现数据加密工具类,Jmeter压测

news2024/11/24 17:50:55

添加依赖配置

		<!-- 仓库地址: https://mvnrepository.com/artifact/commons-codec/commons-codec -->
		<!--	org.apache.commons.codec.binary.Base64	-->
		<dependency>
			<groupId>commons-codec</groupId>
			<artifactId>commons-codec</artifactId>
			<version>1.15</version>
		</dependency>

		<!-- 国密 sm4 依赖jar包 -->
		<dependency>
			<groupId>org.bouncycastle</groupId>
			<artifactId>bcprov-jdk15on</artifactId>
			<version>1.68</version>
		</dependency>

国密SM4并采用CBC分组填充模式,密钥长度为16字节。nonce为16字节,加密使用的nonce和加签一致。
1、密钥为提供提供,nonce为请求中随机生成的字符串
2、使用nonce作为iv
3、使用key、iv,对敏感数据进行加密,得到JSON形式的资源对象
4、对JSON形式的资源对象进行 Base64 编码

工具类实现,如下代码对iv赋值做了简写,可结合自身需要修改:

import com.alibaba.fastjson2.JSON;
import com.risk.decision.params.ConfirmParams;
import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.*;

/**
 * @Author 国密4工具类
 * @Date 2023/10/19 14:21
 * @Description 数据加密解密
 **/
public class Sm4CBCUtils {

    static {
        Security.addProvider(new BouncyCastleProvider());
    }

    public static final String SM4 = "SM4";
    public static final String SM4_CBC_PADDING = "SM4/CBC/PKCS5Padding";

    /**
     * 参数加密
     * @param secretKey 秘钥值
     * @param decryptContext 加密的信息
     * @return String 加密后的值
     * @throws Exception 异常信息
     */
    public static String encryptCBCPadding(String secretKey, String decryptContext) throws Exception {
        Cipher cipher = encryptGenerateCbcCipher(Cipher.ENCRYPT_MODE, secretKey.getBytes());
        byte[] bytes = cipher.doFinal(decryptContext.getBytes());
        byte[] ciphertext = Base64.encodeBase64(bytes);
        return new String(ciphertext, StandardCharsets.UTF_8);
    }

    public static Cipher encryptGenerateCbcCipher(int mode, byte[] key) throws Exception {
        Key sm4Key = new SecretKeySpec(key,SM4);
        Cipher cipher = Cipher.getInstance(SM4_CBC_PADDING, BouncyCastleProvider.PROVIDER_NAME);
        byte[] iv = new byte[16];
        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
        cipher.init(mode, sm4Key, ivParameterSpec);
        return cipher;
    }


    /**
     * 接口解密
     * @param secretKey 秘钥值
     * @param decryptContext 加密的参数
     * @return String 解密的信息
     * @throws Exception 异常信息
     */
    public static String decryptCBCPadding(String secretKey, String decryptContext) throws Exception {
        byte[] decodedBytes = Base64.decodeBase64(decryptContext.getBytes(StandardCharsets.UTF_8));
        Cipher cipher = decryptGenerateCbcCipher(Cipher.DECRYPT_MODE, secretKey.getBytes());
        byte[] bytes = cipher.doFinal(decodedBytes);
        return new String(bytes, StandardCharsets.UTF_8);
    }

    public static Cipher decryptGenerateCbcCipher(int mode, byte[] key) throws Exception {
        Key sm4Key = new SecretKeySpec(key,SM4);
        Cipher cipher = Cipher.getInstance(SM4_CBC_PADDING, BouncyCastleProvider.PROVIDER_NAME);
        // 16字节的偏移向量
        byte[] iv = new byte[16];
        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
        cipher.init(mode, sm4Key, ivParameterSpec);
        return cipher;
    }


}

注: 关于iv值的说明:

在SM4算法中,CBC模式是一种常用的分组密码模式。vi(Initialization Vector)是CBC模式中的初始向量,它的作用是为了增加密码的安全性和随机性

vi是一个固定长度的随机数,它与明文进行异或运算后再进行加密。vi的作用在于使得相同的明文在不同的加密过程中产生不同的密文,增加了密码的随机性。这样做的好处是即使明文相同,密文也会有所不同,从而增加了密码的安全性。

vi是一个必须满足一定要求的随机数,不能随意写死。如果vi被写死为固定的值,那么相同的明文每次加密后都会生成相同的密文,这样就破坏了CBC模式的安全性,攻击者可以通过观察密文的重复模式来推断出明文的信息。

因此,vi需要在每次加密过程中都是随机且不可预测的。一种常见的做法是每次加密时生成一个随机的vi,并将其与密文一起存储或传输,在解密时使用相同的vi进行解密操作。这样可以确保每次加密的结果都是不同的,从而提高密码的安全性。

测试方法:

    public static void main(String[] args) throws Exception {
        ConfirmParams confirmParams = new ConfirmParams();
        confirmParams.setPhoneCode("12388889999");
        confirmParams.setIdCode("999888202309096666");
        String strParams = JSON.toJSONString(confirmParams);
        String secretKey = "qwertyuiop123456";

        // 数据加密
        String encodedText = encryptCBCPadding(secretKey, strParams);
        System.out.println(String.format("加密后的值: %s",encodedText));

        // 数据解密
        String decryptContext = decryptCBCPadding(secretKey, encodedText);
        System.out.println(String.format("解密后的值: %s",decryptContext));

    }

结果打印:

加密后的值: B7Ug2lFn95m8J2JwNdNPt4VKqWV5NF8HCy5Fx0WfEchBGn3uhcDU1Ko6NBwinCieujp5ko2dCkzzIoYcEkm65g==
解密后的值: {"idCode":"999888202309096666","phoneCode":"12388889999"}

接口压测:

服务信息:2台Linux服务器(HA),负载均衡

Jmeter压测: Jmeter安装在Windows环境,受可使用端口的影响,设置50线程,压测40秒

添加断言,方法中处理解密异常,响应码为501,如果断言响应码包含501,则代表响应成功。不包含则表示响应失败。

压测结果,异常率100%,表示接口中并没有返回501的响应码,即解密方法是稳定的,如图:

国密4加密工具ECB模式查看上一篇文章:

SM4国密4在jdk1.7版本和jdk1.8版本中的工具类使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1212435.html

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

相关文章

Python爬虫的七个常用技巧总结,这些你一定得知道!

文章目录 前言1、基本抓取网页2、使用代理IP3、Cookies处理4、伪装成浏览器5、验证码的处理6、gzip压缩7、多线程并发抓取关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战…

5+单基因+免疫浸润,这篇肿瘤预后文章你值得拥有

今天给同学们分享一篇生信文章“Systematic analysis of the role of SLC52A2 in multiple human cancers”&#xff0c;这篇文章发表在Cancer Cell Int期刊上&#xff0c;影响因子为5.8。 结果解读&#xff1a; 多种人类癌症中SLC52A2的mRNA表达 首先&#xff0c;作者使用GT…

Linux设备树(DTS)介绍

Dts&#xff1a;DTS即Device Tree Source&#xff0c;是一个文本形式的文件&#xff0c;用于描述硬件信息。一般都是固定信息&#xff0c;无法变更&#xff0c;无法overlay。 设备树由来 linux内核源码中&#xff0c;之前充斥着大量的平台相关&#xff08;platform Device&…

Windows系统CMake+VS编译protobuf

目录 一些名词CMake构建VS工程下载protobuf源码下载CMake编译QT中使用 方案二失败&#xff1a;CMakeQT自带的Mingw编译参考链接 一些名词 lib dll lib库实际上分为两种&#xff0c;一种是静态链接lib库或者叫做静态lib库&#xff0c;另一种叫做动态链接库dll库的lib导入库或称…

为什么程序员一定要写单元测试?

大家好&#xff0c;我是鱼皮&#xff0c;很多初学编程的同学都会认为 “程序员的工作只有开发新功能&#xff0c;功能做完了就完事儿”。但其实不然&#xff0c;保证程序的正常运行、提高程序的稳定性和质量也是程序员的核心工作。 之前给大家分享过企业项目的完整开发流程&am…

【numpy】数据类型

1、Numpy Python 的扩展库&#xff08;数学函数库&#xff09;&#xff0c;主要用于数组计算。 N维数组对象ndarray广播功能函数整合C/C/Fortran代码的工具线性代数、傅里叶变换、随机数生成等功能 通常与SciPy&#xff08;开源算法库和数学工具包&#xff09;和Matplotlib&a…

action3录制出来的LRF文件的正确打开方式

你会发现使用大疆的产品录制出来的视频会有两种格式&#xff1a;LRF和MP4 这个LRF文件是低分辨率、低码率的预览文件&#xff0c;非常适合预览。 这个文件可以直接通过修改文件后缀转化为.mp4格式

STM32速成笔记—SPI通信

&#x1f380; 文章作者&#xff1a;二土电子 &#x1f338; 关注公众号获取更多资料&#xff01; &#x1f438; 期待大家一起学习交流&#xff01; 文章目录 一、SPI简介二、SPI的四种工作方式三、STM32的SPI通信3.1 SPI内部结构分析3.2 SPI引脚 四、SPI通信程序设计4.1 S…

RSS订阅快速连接Notion

数环通让您可以通过不到几分钟的时间即可实现RSS订阅与Notion的对接与集成&#xff0c;从而高效实现工作流程自动化&#xff0c;降本增效&#xff01; 1.产品介绍 RSS订阅是数环通的内置应用&#xff0c;很多用户通过RSS订阅来收集自己在各大平台上看的内容&#xff0c;当RSS…

清晨早安问候祝福语精选,相互牵挂,祝福无价!

1、有一种祝福&#xff0c;时刻都在心里。无论相隔多远&#xff0c;都能温暖彼此的心灵。珍惜美丽相遇&#xff0c;珍藏这份情意。忙碌不是忘记&#xff0c;牵挂一直都在心里。送上一份心的祝福&#xff0c;书写一份心的牵挂&#xff0c;坦诚相待&#xff0c;温暖相伴&#xff…

XXX系统测试报告测试用例模板

XXX系统测试报告 编制&#xff1a; 2023-5-16 审核&#xff1a; 日期&#xff1a; 批准&#xff1a; 日期&#xff1a; 版本 修订时间 修订人 修订类型 修订章节 修订内容 *修订类型分为 A …

Spring Framework 核心容器详解:Core、Beans、Context 和 Expression Language 模块

Spring可能成为您的所有企业应用程序的一站式商店。但是&#xff0c;Spring是模块化的&#xff0c;允许您挑选适用于您的模块&#xff0c;而无需引入其他模块。下面的部分提供了Spring Framework中所有可用模块的详细信息。 Spring Framework提供了大约20个模块&#xff0c;可…

八大学习方法(金字塔模型、费曼学习法、布鲁姆学习模型)

在微博上看到博主发的&#xff0c;觉得总结很好&#xff0c;在此摘录&#xff1a;

JZ22:链表中倒数第k个结点

JZ22&#xff1a;链表中倒数第k个结点 题目描述&#xff1a; 输入一个链表&#xff0c;输出该链表中倒数第k个结点。 示例1 输入&#xff1a; 1,{1,2,3,4,5} 返回值&#xff1a; {5} 分析&#xff1a; 快慢指针思想&#xff1a; 需要两个指针&#xff0c;快指针fast&…

JS-项目实战-编辑单价单元格,可以点击单价单元格并且出现文本框,并自动选中输入框内部的文本

1、鼠标悬浮和离开事件.js //当页面加载完成后执行后面的匿名函数 window.onload function () {//get:获取 Element:元素 By:通过...方式//getElementById()根据id值获取某元素let fruitTbl document.getElementById("fruit_tbl");//table.rows:获取这个表格…

Nginx + RTMP + nginx-http-flv-module 环境搭建(CentOS 7)

文章目录 1. 引言2. 安装 Nginx3. 安装依赖库4. 下载编译 Nginx with RTMP 模块5. 配置 Nginx6. 启动 Nginx7. 推流测试8. 播放测试9. 拓展9.1 鉴权配置9.2 HTTPS 配置9.3 安全性配置 10. 小结 &#x1f389;Nginx RTMP nginx-http-flv-module 环境搭建&#xff08;CentOS 7&…

程序员进阶之路,该怎么走?

时代洪流&#xff0c;大浪淘沙。 逆水行舟&#xff0c;不进则退。 如果你游的速度慢于水流&#xff0c;要么你就是被剩下的沙子&#xff0c;要么就是即将被打翻的行舟了。。。 身为程序员时刻保持危机感&#xff0c;然后陷入内卷...... 卷又卷不赢&#xff0c;躺又躺不平。 …

如何使用代理IP访问YouTube?

相信大家对YouTube都很熟悉&#xff0c;但是由于网络安全管制&#xff0c;我们在看YouTube视频时经常遇到由于地理封锁或网络限制而受到限制的人吗&#xff1f;如果是这样&#xff0c;您一定听说过代理IP&#xff08;代理服务器&#xff09;以及它们如何帮助您绕过此类限制&…

计算机视觉:使用opencv实现车牌识别

1 引言 汽车车牌识别&#xff08;License Plate Recognition&#xff09;是一个日常生活中的普遍应用&#xff0c;特别是在智能交通系统中&#xff0c;汽车牌照识别发挥了巨大的作用。汽车牌照的自动识别技术是把处理图像的方法与计算机的软件技术相连接在一起&#xff0c;以准…

2022年06月 Scratch(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

一、单选题(共25题,每题2分,共50分) 第1题 广场中有声控喷泉,当声音的音量大于60的时候,喷泉就会喷出水,现在的音量为30,下列哪个选项可以让喷泉喷出水? A: B: C: D: 答案:B 当前声音的音量为30,需要将声音增加到60以上就可以让喷泉喷出水,选项A将声音…