Spring HTTP请求与应答国密算法加解密(对称加密方式SM4)

SM4算法成为行业标准:

  • SM4分组密码算法是2012年3月21日实施的一项行业标准;
  • 2021年6月25日,我国SM4分组密码算法作为国际标准ISO/IEC 18033-3:2010/AMD1:2021《信息技术 安全技术 加密算法 第3部分:分组密码 补篇1:SM4》,由国际标准化组织ISO/IEC正式发布;
  • 中文名SM4分组密码算法标准号GM/T 0002-2012实施日期2012-03-21发布日期2012-03-21技术归口国家密码管理局批准发布部门国家密码管理局。

SM4算法的重要性

是我国提出的分组密码算法,而且得到了国际的认可;是继SM2/SM9数字签名算法、SM3密码杂凑算法、祖冲之密码算法和SM9标识加密算法之后,我国又一个商用密码算法被纳入ISO/IEC国际标准正式发布;标志着我国商用密码算法国际标准体系进一步完善,展现了我国先进的密码科技水平和国际标准化能力,对提升我国商用密码产业发展、推动商用密码更好服务“一带一路”建设具有重要意义;

  • SM4分组密码算法是一种迭代分组密码算法,由加解密算法和密钥扩展算法组成;
  • SM4是一种Feistel结构的分组密码算法,其分组长度和密钥长度均为128bits。加密算法和密钥扩展算法迭代轮数均为32轮;
  • SM4加解密过程的算法相同但是轮密钥的使用顺序相反;
  • SM4密码算法使用模2加和循环移位作为基本运算;
  • 密钥扩展算法:SM4算法使用128位的加密密钥,并采用32轮迭代加密结构,每一轮加密使用一个32位的轮密钥,总共使用32个轮密钥。因此需要使用密钥扩展算法,从加密密钥中产生32个轮密钥;
  • 密钥:加密密钥的长度为128比特。

一 使用hutool实现SM4算法的封装

1. pom文件中添加依赖

<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15to18</artifactId><version>1.69</version>
</dependency>

 2. application.yml增加配置

#SM4配置 国密对称加密:SM4
SM4:key: 1234567890ABCDEF

3. 使用方式

@Value("${SM4.key}")
private String sm4Key;SymmetricCrypto sm4 = SmUtil.sm4(sm4Key.getBytes(StandardCharsets.UTF_8));
String encryptText = sm4.encryptHex(dataText);

二 解决request流只能读取一次的问题

继承HttpServletRequestWrapper,将请求中的流copy一份,复写getInputStream和getReader方法供外部使用。每次调用后的getInputStream方法都是从复制出来的二进制数组中进行获取,这个二进制数组在对象存在期间一致存在。使用Filter过滤器,替换request为自己定义的可以多次读取流的request。

1.创建InputStreamHttpServletRequestWrapper继承HttpServletRequestWrapper

import org.apache.commons.io.IOUtils;import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;/*** InputStreamHttpServletRequestWrapper* 请求流支持多次获取**/
public class InputStreamHttpServletRequestWrapper extends HttpServletRequestWrapper {/*** 用于缓存输入流*/private ByteArrayOutputStream cachedBytes;public InputStreamHttpServletRequestWrapper(HttpServletRequest request) {super(request);}@Overridepublic ServletInputStream getInputStream() throws IOException {if (cachedBytes == null) {// 首次获取流时,将流放入 缓存输入流 中cacheInputStream();}// 从 缓存输入流 中获取流并返回return new CachedServletInputStream(cachedBytes.toByteArray());}@Overridepublic BufferedReader getReader() throws IOException {return new BufferedReader(new InputStreamReader(getInputStream()));}/*** 首次获取流时,将流放入 缓存输入流 中*/private void cacheInputStream() throws IOException {

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

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

相关文章

Flask登陆后登陆状态及密码的修改和处理

web/templates/common 是统一布局 登录成功 后flask框架服务器默认由login.html进入仪表盘页面index.html(/),该页面的设置在 (web/controllers/user/index.py)&#xff0c;如果想在 该仪表盘页面 将 用户信息 展示出来&#xff0c;就得想办法先获取到 当前用户的 登陆状态。…

2022年全国职业院校技能大赛高职组云计算正式赛卷第三场-公有云

2022 年全国职业院校技能大赛高职组云计算赛项试卷 【赛程名称】云计算赛项第三场-公有云 目录 2022 年全国职业院校技能大赛高职组云计算赛项试卷 【赛程名称】云计算赛项第三场-公有云 【任务 1】公有云服务搭建[10 分] 【任务 2】公有云服务运维[10 分] 【任务 3】公有云运维…

兔子的序列

题目&#xff1a; 输入描述&#xff1a; 第一行一个整数 n&#xff0c;表示序列的长度。 第二行有 n 个整数 ai&#xff0c;表示序列中的 n 个数分别是多少。 输出描述&#xff1a; 输出仅一行&#xff0c;表示这个序列的名字&#xff0c;也就是这个序列中最大的非完全平方…

03.MySQL的体系架构

MySQL的体系架构 一、MySQL简介二、MySQL的体系架构三、MySQL的内存结构四、MySQL的文件结构 一、MySQL简介 MySQL是一个开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由瑞典MySQL AB公司开发&#xff0c;后被Sun公司收购&#xff0c;Sun公司被Oracle…

【Web2D/3D】Canvas(第三篇)

1. 前言 <canvas>是HTML5新增元素&#xff0c;它是一个画板&#xff0c;开发人员基于它的2D上下文或webgl上下文&#xff0c;使用JS脚本绘制简单的动画、可交互画面&#xff0c;甚至进行视频渲染。 本篇介绍基于canvas的2D上下文绘制2D画面的一些方法和属性。 2. canvas…

【leetcode225】用队列实现栈Java代码讲解

12.27 225. 用队列实现栈 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void push(int x) 将元素 x 压入栈顶。int pop() 移除…

文件操作安全之-目录穿越流量告警运营分析篇

本文从目录穿越的定义,目录穿越的多种编码流量数据包示例,目录穿越的suricata规则,目录穿越的告警分析研判,目录穿越的处置建议等几个方面阐述如何通过IDS/NDR,态势感知等流量平台的目录穿越类型的告警的线索,开展日常安全运营工作,从而挖掘有意义的安全事件。 目录穿越…

向ES索引里面添加一个字段并更新旧文档数据

问题 最近需要调整ES索引&#xff0c;添加1个字段&#xff0c;并且&#xff0c;对旧文档数据更新新加的字段默认值。 解决思路 通过利用Update mapping API添加1个新字段后&#xff0c;然后&#xff0c;利用Update By Query API将向旧文档数据添加新加字段默认值。 添加字段…

鸿蒙Harmony(八)ArkUI--状态管理器之@State

状态管理 在声明式UI中&#xff0c;是以状态驱动视图更新 状态&#xff1a;指驱动视图更新的数据&#xff08;被装饰器标记的变量&#xff09; StateProp 和 LinkProvide和 Consume State State装饰器标记的变量必须初始化&#xff0c;不能为空值State支持Object 、class、…

ts中的任意接口

interface Persontest {name:string;[key:string]:any } var psss:Persontest{name:1,age:10,sex:男,[Symbol()]:灵境胡同 }ts中&#xff0c;[Symbol()] 是一个计算属性名称的语法&#xff0c;可以在对象字面量中使用 Symbol 类型来动态地生成属性名称&#xff0c;[Symbol()] 生…

【PostgreSQL内核学习(二十)—— 数据库中的遗传算法】

数据库中的遗传算法 概述个体的编码方式及种群初始化geqo 函数 适应值geqo_eval 函数gimme_tree 函数 父体选择策略geqo_selection 函数 杂交算子边重组杂交 ERX ( edge recombination crossover)gimme_edge_table 函数gimme_tour 函数 变异算子geqo_mutation 函数 声明&#x…

Java EE 网络原理之HTTP 响应详解

文章目录 1. 认识"状态码"(status code)2. 通过 form 表单构造 HTTP 请求3. 通过 ajax 构造 HTTP 请求 1. 认识"状态码"(status code) 表示了这次请求对应的响应&#xff0c;是什么样的状态 &#xff08;成功&#xff0c;失败&#xff0c;其他的情况&…

Flask 用户信息编辑系统

Flask 用户信息编辑系统 web/templates/user/edit.html {% extends "common/layout_main.html" %} {% block content %} {% include "common/tab_user.html" %} <div class"row m-t user_edit_wrap"><div class"col-lg-12"…

Java面试题86-95

86. Java代码查错&#xff08;4&#xff09;public class Something { public int addOne(final int x) { return x; }}此代码有错误吗&#xff1f;答案: 错。int x被修饰成final&#xff0c;意味着x不能在addOne method中被修改。87. Java代码查错&#xff08;5&…

Oracle如何自定义数据类型和数组和在数组中使用自定义类型

在Oracle数据库中&#xff0c;你可以自定义数据类型和数组。以下是如何做到这一点的简要指南&#xff1a; 自定义数据类型&#xff1a; 你可以使用CREATE TYPE语句来定义一个新类型。例如&#xff0c;定义一个名为person的类型&#xff0c;它包含两个属性&#xff1a;name和a…

12.Go 函数

1、函数的声明 语法&#xff1a;func 函数名(参数列表)(返回参数列表){函数体} 函数名遵循标识符的命名规则&#xff0c;首字母的大小写决定该函数在其他包的可见性&#xff1a;大写时其他包可见&#xff0c;小写时只有相同的包可以访问&#xff1b;函数的参数和返回值需要使…

GIT提交、回滚等基本操作记录

1、add文件时warning: LF will be replaced by CRLF in .idea/workspace.xml. 原因&#xff1a;windows中的换行符为 CRLF&#xff0c; 而在Linux下的换行符为LF&#xff0c;所以在执行add . 时会出现以下提示 解决&#xff1a;git config core.autocrlf false 2、GIT命令&…

pip 国内镜像源

pip 国内镜像源 部分可用的pip国内镜像源有下面这些&#xff1a; 阿里云 http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 豆瓣 http://pypi.douban.com/simple Python官方 https://pypi.python.org/simple/ v2ex http://pypi…

HarmonyOS应用开发实战—开箱即用的登录页面3【ArkTS】

文章目录 一.HarmonyOS应用开发实战—开箱即用的登录页面2【ArkTS】【鸿蒙专栏-31】1.1 项目背景1.2 ArkTS详解二.HarmonyOS应用开发实战—开箱即用的登录页面3【ArkTS】2.1 ArkTS页面源码2.2 代码解析2.3 心得一.HarmonyOS应用开发实战—开箱即用的登录页面2【ArkTS】【鸿蒙专…

【微信】公众号授权绑定登录流程详解

在做微信公众号开发时&#xff0c;经常需要对公众号上面的菜单做授权登录&#xff0c;如果是首次登录还需要做微信openId和系统账号的绑定操作。 这里做如下假设&#xff1a; 系统前端地址&#xff1a;http://www.test.com系统接口地址&#xff1a;http://api.test.com需要打…