项目数据接口国密支持

项目数据接口国密支持

说明

国密即国家密码局认定的国产密码算法,即商用密码。

国密主要有SM1,SM2, SM3, SM4。密钥长度和分组长度均为128位。

1、SM1为对称加密。其加密强度与AES(高级加密标准, Advanced Encryption Standard)相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。
2、SM2为非对称加密,基于ECC。 该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA。
3、SM3为消息摘要。可以用MD5作为对比理解。该算法已公开。校验结果为256位。
4、SM4为无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。
由于SM1、SM4加解密的分组大小为128bit,故对消息进行加解密时,若消息长度过长,需要进行分组,要消息长度不足,则要进行填充。

国家在大力推进商用密码应用,并大力推广国产化

尤其在甲方为国企客户情况,需要针对产品上行到平台的数据以及对平台下行到设备的数据进行国密加解密!!!


项目使用

对SM2/SM4支持

项目为spingboot的Java常规maven管理的,jdk1.8+;

添加Maven依赖
        <!--SM2加密算法依赖--><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.68</version></dependency><!-- SM4加密算法依赖--><dependency><groupId>cn.hutool</groupId><artifactId >hutool-crypto</artifactId><version>5.7.1</version></dependency>
编写工具类
@Component
public class EncryptionUtils {// SM2非对称加密public static String sm2Encrypt(String publicKey,String plainText) {SM2 sm2 = new SM2(null, publicKey);String res = sm2.encryptBcd(plainText, KeyType.PublicKey);return res;}// SM2非对称解密public static String sm2Decrypt(String privatekey, String cipherText) {SM2 sm2 = new SM2(privatekey, null);return sm2.decryptStr(cipherText, KeyType.PrivateKey ,CharsetUtil.CHARSET_UTF_8);}// SM4对称加密public static String sm4Encrypt(String secretKey, String plainText) {SM4 sm4 = SmUtil.sm4(secretKey.getBytes());return sm4.encryptHex(plainText);}// SM4对称解密public static String sm4Decrypt(String secretKey, String cipherText) {SM4 sm4 = SmUtil.sm4(secretKey.getBytes());return sm4.decryptStr(cipherText, CharsetUtil.CHARSET_UTF_8);}public static void main(String[] args) {// 生成SM2秘钥
//        Map<String, String> smKeyMap = EncryptionUtils.generateSm2Key();
//        String publicKey = smKeyMap.get("KEY_PUBLIC_KEY");
//        String privateKey = smKeyMap.get("KEY_PRIVATE_KEY");
//        System.out.println("公钥:" + publicKey);
//        System.out.println("私钥:" + privateKey);// 生成SM4秘钥System.out.println("生成SM4秘钥:"+EncryptionUtils.generateKey());}/*** 生成SM2公私钥** @return*/public static Map<String, String> generateSm2Key() {SM2 sm2 = new SM2();ECPublicKey publicKey = (ECPublicKey) sm2.getPublicKey();ECPrivateKey privateKey = (ECPrivateKey) sm2.getPrivateKey();// 获取公钥byte[] publicKeyBytes = publicKey.getQ().getEncoded(false);String publicKeyHex = HexUtil.encodeHexStr(publicKeyBytes);// 获取64位私钥String privateKeyHex = privateKey.getD().toString(16);// BigInteger转成16进制时,不一定长度为64,如果私钥长度小于64,则在前方补0StringBuilder privateKey64 = new StringBuilder(privateKeyHex);while (privateKey64.length() < 64) {privateKey64.insert(0, "0");}Map<String, String> result = new HashMap<>();result.put("KEY_PUBLIC_KEY", publicKeyHex);result.put("KEY_PRIVATE_KEY", privateKey64.toString());return result;}public static String generateKey()  {// 生成SM4秘钥String key = RandomUtil.randomString(16);System.out.println("生成1个128bit的加密key:"+key);return key;}
}
项目切面编程

需要解密则需要使用拦截器等进行请求前置处理

定义注解:

/*** 加密生成类 注解,对返回数据进行加密* 响应结果加密* 条件:*  1.添加注解:@EncryptionAnnotation*  2.返回类型为 R / AjaxResult* 加密内容为:R.data -> R.encryptData* 加密算法支持:国密-SM2/SM4* @author xiaohang*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface EncryptionAnnotation {
}

切面编程:

对返回类需要根据项目定义进行统一配置修改

/*** 响应结果加密* 条件:*  1.添加注解:@EncryptionAnnotation*  2.返回类型为 AjaxResult* 加密内容为:AjaxResult.data -> R.encryptData* 加密算法支持:国密-SM2/SM4* @author xiaohang*/
@ControllerAdvice
public class EncryptAjaxResultResponseBodyAdvice implements ResponseBodyAdvice<AjaxResult> {@Value("${data.encrypt.publicKey}")private String publicKey;@Value("${data.encrypt.privateKey}")private String privatekey;@Value("${data.encrypt.open}")private boolean open;@Value("${data.encrypt.showLog}")private boolean showLog;@Value("${data.encrypt.type}")private String encryptType;@Value("${data.encrypt.secretKey}")private String secretKey;@Overridepublic boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {if (!returnType.hasMethodAnnotation(EncryptionAnnotation.class)){return false;}String returnName = returnType.getParameterType().getName();if (returnName.equals(AjaxResult.class.getName()) ) {return true;}return false;}@SneakyThrows@Overridepublic AjaxResult beforeBodyWrite(AjaxResult body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {if (!open) {return body;}// 真实数据Object data = body.get(AjaxResult.DATA_TAG);// 如果data为空,直接返回if (data == null) {return body;}String dataText = JSONUtil.toJsonStr(data);// 如果data为空,直接返回if (StringUtils.isBlank(dataText)) {return body;}String encryptText;try {if ("SM2".equals(encryptType)){encryptText = EncryptionUtils.sm2Encrypt(publicKey,dataText);}else if ("SM4".equals(encryptType)){encryptText = EncryptionUtils.sm4Encrypt(secretKey,dataText);}else{encryptText = null;}if (showLog){System.out.println("加密前明文:"+dataText);System.out.println("加密后密文:"+encryptText);}}catch (Exception e){e.printStackTrace();encryptText="数据加密异常,请联系管理人员!";}body.put(AjaxResult.ENCRYPT_DATA,encryptText);body.put(AjaxResult.DATA_TAG,null);return body;}
}
参数配置
# 数据加密
data:encrypt:open: trueshowLog: falsetype: SM2publicKey: 【SM2的公钥】privateKey: 【SM2的私钥】secretKey: 【SM4的密钥】
测试使用
@Slf4j
@RestController
@RequestMapping("test")
public class TestController extends BaseController{@GetMapping("encryption")@EncryptionAnnotationpublic AjaxResult encryption2(String data){CommercialTenant t = new CommercialTenant();t.setBrandName("加密测试,返回AjaxResult的数据");return AjaxResult.success(t);}
}

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

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

相关文章

2024.5.9 关于 SpringCloud —— Nacos 的安装与配置

目录 Windos 安装步骤 docker 启动 nacos Windos 安装步骤 1&#xff09;点击下方链接&#xff0c;进入并访问 nacos 官网 Nacos官网 | Nacos 官方社区 | Nacos 下载 | Nacos 2&#xff09;按照下图箭头指示下载对应版本的压缩包 3&#xff09;此时我们将得到一个压缩包&…

内容自动化的进阶之路:Kompas.ai带你走进智能创作时代

在数字化媒体的浪潮中&#xff0c;内容创作和管理正变得越来越复杂和挑战性。为了应对这一挑战&#xff0c;内容自动化技术应运而生&#xff0c;它通过使用人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;算法&#xff0c;自动化内容创作的多个环节&a…

Sass详解:颠覆CSS开发的新时代

在前端开发领域&#xff0c;CSS是网页样式设计的重要组成部分&#xff0c;而Sass作为CSS的扩展语言&#xff0c;为开发者提供了更加强大和灵活的样式编写方式。本文将深入探讨Sass的各项特性、优势以及应用场景&#xff0c;帮助读者更好地理解和运用这一强大工具。 1. Sass是什…

引入外部依赖集成示例

1、package.json引入相关依赖 “dataview/engine”: “2.0.0-beta.7”, “dataview/plugin-tech”: “1.0.0-beta.1”, Engine为引擎&#xff0c;plugin-tech为Dataview中的科技风元件&#xff0c;若不引入会造成使用了科技风元件的页面无法正确渲染。引入后&#xff0c;重新执…

历史人物数字人如何成为地方文化推广大使?

如今&#xff0c;文旅产业业态已经从“打卡式旅游”逐渐走向“体验型旅游”转变。数字人可以为游客提供情绪价值、引起情感共鸣的文化体验。不少文旅品牌通过打造历史人物数字人&#xff0c;将城市民俗风情、非物质文化遗产等相结合&#xff0c;并且结合AI交互数字人的人机对话…

【C++】继承(上)(超详细,保证你学会)

什么是继承&#xff1f; 1.语法 1.1例子 通过这种方法&#xff0c;Student和Teacher这两个类就继承了Person的成员变量和成员函数&#xff0c;可以直接调用它们。 如图&#xff0c;如果成员变量和成员函数在基类中是公有的话就可以直接访问&#xff01;但如果是私有和保护的话就…

4种前端处理文本换行展示

序: 后端传递了一大段包含了回车符的文本内容,前端展示的时候所有文字堆在一起,没有换行展示。以下方法中content为后端返回的文本内容 方法一: “↵”符号在html中会识别别为\r,\n等转义字符,所以我们可以使用\r\n去替换(.replace(/(\r\n|\n|\r)/gm, ’< br />…

【FFmpeg】调用ffmpeg库进行RTMP推流和拉流

【FFmpeg】调用ffmpeg库实现RTMP推流 1.FFmpeg编译2.RTMP服务器搭建3.调用FFmpeg库实现RTMP推流和拉流3.1 基本框架3.2 实现代码3.3 测试3.3.1 推流3.3.2 拉流 参考&#xff1a;雷霄骅博士, 调用ffmpeg库进行RTMP推流 示例工程 【FFmpeg】调用FFmpeg库实现264软编 【FFmpeg】…

/usr/bin/ld: cannot find -l<nameOfTheLibrary>

在编译程序报了如下错误&#xff1a;/usr/bin/ld: cannot find -lmtcr_ul: No such file or directory 他的命名规则时"lnameOfTheLibrary"&#xff0c;所以我缺少一个mtcr_ul相关的库 问题原因 根本原因&#xff1a;还是某一个lib库文件不存在&#xff0c;你可以通…

SpringAMQP Work Queue 工作队列

消息模型: 代码模拟: 相较于之前的基础队列&#xff0c;该队列新增了消费者 不再是一个&#xff0c;所以我们通过代码模拟出两个consumer消费者。在原来的消费者类里写两个方法 其中消费者1效率高 消费者2效率低 RabbitListener(queues "simple.queue")public voi…

简化 KNN 检索【翻译】Simplifying kNN search

简化 KNN 检索 #转载 #大数据/ES #翻译 这篇文章是关于如何简化 k 最近邻&#xff08;k-Nearest Neighbors&#xff0c;简称 kNN&#xff09;搜索的深入探讨。以下是对全文的翻译(借助 kimi AI)&#xff1a; 在这篇博客文章中&#xff0c;我们将深入探讨我们为使 kNN 搜索的入…

mes系统业务学习

MES-生产溯源: 一物一码&#xff1a;一物一码&#xff0c;通过包装物或产品本身的条码追溯相关联原料、供应商、客户、订单、生产人员、生产过程、质检报告、售后等关键信息&#xff0c;覆盖产品全生命周期。精准质量追溯&#xff1a;通过采集扫描即时记录跟踪每一个关键信息&…

Arduino-ILI9341驱动开发TFT屏显示任意内容三

Arduino-ILI9341驱动开发TFT屏显示任意内容三 1.概述 这篇文章介绍使用ILI9341驱动提供的函数控制TFT屏显示字符串、图形、符号等等内容的编辑和展示。 2.硬件 2.1.硬件列表 名称数量Arduino Uno12.8" TFT彩色液晶触摸屏模块&#xff08;ILI9431&#xff09;110K 电阻…

SpringBootWeb 篇-深入了解请求响应(服务端接收不同类型的请求参数的方式)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 请求响应概述 1.1 简单参数 1.2 实体参数 2.3 数组集合参数 2.4 日期参数 2.5 json 参数 2.6 路径参数 3.0 完整代码 1.0 请求响应概述 当客户端发送不同的请求参…

Selenium定位方法及代码

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

中国1KM年相对湿度数据集1981-2020

大气相对湿度&#xff08;RH&#xff09;是气象/气候监测和研究的关键因素。然而&#xff0c;相对湿度在气候变化研究中的应用并不是很普遍&#xff0c;部分原因是相对湿度观测系列容易由于观测系统中的非气候变化而产生不均匀偏差。 该数据集是中国1km分辨率年相对湿度数据&am…

使用依赖注入(DI)的方式实现对冗余代码的解耦

1.1、优化前代码 GetMapping("/test") public void test(RequestParam("params") String params){if("1".equals(params)){// 逻辑代码}if("2".equals(params)){// 逻辑代码}if("3".equals(params)){// 逻辑代码} }1.2、优…

『大模型笔记』Google DeepMind and Isomorphic Labs联合发布AlphaFold 3!

Google DeepMind and Isomorphic Labs联合发布AlphaFold 3! 文章目录 一. Google DeepMind and Isomorphic Labs联合发布AlphaFold 3!AlphaFold 3 及其后续研究总结视频中提到的局限性AlphaFold Server结论二. 参考文献中文字幕视频链接,欢迎关注我的xhs账号:Google CEO 皮…

【MsSQL】数据库基础 库的基本操作

目录 一&#xff0c;数据库基础 1&#xff0c;什么是数据库 2&#xff0c;主流的数据库 3&#xff0c;连接服务器 4&#xff0c;服务器&#xff0c;数据库&#xff0c;表关系 5&#xff0c;使用案例 二&#xff0c;库的操作 1&#xff0c;创建数据库 2&#xff0c;创建…

华为配置Ethernet over GRE实现AC与无线网关之间的二层互通

华为配置Ethernet over GRE实现AC与无线网关之间的二层互通 组网图形 图1 通过Ethernet over GRE实现AC与无线网关之间的二层互通的组网图 组网需求数据规划配置思路操作步骤配置文件 组网需求 如图1所示&#xff0c;某企业通过无线网络为用户提供上网服务&#xff0c;其中A…