接口安全设计原则的一个点就是数据不能明文传输,除了https这个必须的请求外,接口数据加密也是一个重要的方式,下面介绍一下SM2国密算法加解密的使用方式。

这里我就针对目前前后端分离架构的方式来简单介绍一下如何正确使用SM2算法对数据进行加解密,介绍分为后端加解密和前端加解密。

1.后端加解密

1.1 导入POM依赖

<!-- hutool -->
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.5</version>
</dependency>
<!-- 加解密依赖包 -->
<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15to18</artifactId><version>1.71</version>
</dependency>

1.2 生成公钥、私钥密钥对

/*** 生成公钥、私钥,这个保存好,尤其是私钥,切记不可泄漏*/
public static void generateCommonKey() {SM2 sm2 = SmUtil.sm2();// 私钥:这个保存好,切记不要泄漏,真的泄露了就重新生成一下byte[] privateKey = BCUtil.encodeECPrivateKey(sm2.getPrivateKey());// 公钥:这个是前后端加密用的,不压缩选择带04的,不带04到时候前端会报错byte[] publicKey = ((BCECPublicKey) sm2.getPublicKey()).getQ().getEncoded(false);Console.log("公钥:\n{}", HexUtil.encodeHexStr(publicKey));Console.log("私钥:\n{}", HexUtil.encodeHexStr(privateKey));
}

1.3 加解密

/*** sm2明文加密* PRIVATE_KEY:生成的私钥* PUBLIC_KEY:生成的公钥* @param data 加密前的明文* @return 加密后的密文*/
public static String encryptData(String data) {SM2 sm2 = SmUtil.sm2(ECKeyUtil.toSm2PrivateParams(PRIVATE_KEY), ECKeyUtil.toSm2PublicParams(PUBLIC_KEY));String encryptBcd = sm2.encryptBcd(data, KeyType.PublicKey);// 这里的处理前端也可以处理,这个就看怎么约定了,其实都无伤大雅if (StrUtil.isNotBlank(encryptBcd)) {// 生成的加密密文会带04,因为前端sm-crypto默认的是1-C1C3C2模式,这里需去除04才能正常解密if (encryptBcd.startsWith("04")) {encryptBcd = encryptBcd.substring(2);}// 前端解密时只能解纯小写形式的16进制数据,这里需要将所有大写字母转化为小写encryptBcd = encryptBcd.toLowerCase();}return encryptBcd;
}/*** sm2密文解密* PRIVATE_KEY:生成的私钥* PUBLIC_KEY:生成的公钥* @param encryptData 加密密文* @return 解密后的明文字符串*/
public static String decryptData(String encryptData) throws Exception {if (StrUtil.isBlank(encryptData)) {throw new RuntimeException("解密串为空,解密失败");}SM2 sm2 = SmUtil.sm2(ECKeyUtil.toSm2PrivateParams(PRIVATE_KEY), ECKeyUtil.toSm2PublicParams(PUBLIC_KEY));// BC库解密时密文开头必须带04,如果没带04则需补齐if (!encryptData.startsWith("04")) {encryptData = "04".concat(encryptData);}byte[] decryptFromBcd = sm2.decryptFromBcd(encryptData, KeyType.PrivateKey);if (decryptFromBcd != null && decryptFromBcd.length > 0) {return StrUtil.utf8Str(decryptFromBcd);} else {throw new Exception("密文解密失败");}
}

2.前端加解密

2.1 安装NPM包依赖

npm install --save sm-crypto

2.2 新建公共sm2.js

const sm2 = require('sm-crypto').sm2;
// 加密策略,1 - C1C3C2,0 - C1C2C3,默认为1
const encryptMode = 1;
const publicUiKey = '后端生成的公钥';
const privateKey = '后端生成的私钥';/*** 加密数据* @param {Object} data 明文数据*/
export function encryptData(data) {if (data && (typeof data === 'string') && (data.constructor === String)) {return '04'.concat(sm2.doEncrypt(data, publicUiKey, encryptMode));}return data;
}/*** 加密对象数据* @param {Object} data 对象明文*/
export function encryptObjectData(data) {if (data) {return '04'.concat(sm2.doEncrypt(JSON.stringify(data), publicUiKey, encryptMode));}return data;
}/*** 解密数据* @param {Object} dataHex 加密的密文数据*/
export function decryptData(encryptData) {if (encryptData && (typeof encryptData === 'string') && (encryptData.constructor === String)) {const decryptData = sm2.doDecrypt(encryptData, privateKey, encryptMode);return decryptData;}
}

2.3 使用

import { encryptData, decryptData} from "../../../request/sm2.js";
encryptData('明文');
decryptData('密文');

3.参考文档

https://www.npmjs.com/package/sm-crypto

SM2国密算法加解密相关推荐

  1. 国密SM4加解密SM2签名验签COM组件DLL

    提供给第三方软件,调用COM组件DLL方式进行实现,如delphi.PB等. 基于C#编写的COM组件DLL,可实现SM2签名验签,SM4加解密,100%适用于黑龙江省国家医保接口中进行应用. 功能包 ...

  2. SM2 国密算法被 Linux 内核社区接受

    喜欢就关注我们吧! 10 月 25 日,有开发者发文称,SM2 国密算法终于被 Linux 内核社区接受了.该作者表示,SM2 的补丁已经更新到了 v7 版本,这个版本的补丁最终被社区接受,目前已经合 ...

  3. 记自己发现的—SM2国密算法应用的高危漏洞—CVE-2021-3711

    openssl在8月24日发布了openssl 1.1.1l的稳定版,其中修复了一个高危漏洞:CVE-2021-3711.该漏洞会影响openssl 1.1.1l 之前的所有包含SM2商密算法版本,其 ...

  4. SM2国密算法公钥解压缩

    SM2一般用到的或者第三方提供的公钥都是压缩过的,长度为66个长度,既33字节. 格式如下,保密期间秘钥内容用*代替了,从02到....3F3B共33字节.66个长度 06:028736002931F ...

  5. 基于Java的(SM2_SM3_SM4)国密算法, 加密解密工具类及测试demo

    编写本文的同时借鉴了多位同学写的demo, 最后发现这位同学写的最详细, 放上该作者的链接, 原版链接: https://download.csdn.net/download/ererfei/9474 ...

  6. 密信国密浏览器:推动SM2国密算法和国密SSL证书应用

    为什么80%的码农都做不了架构师?>>>    国密浏览器的普及是推广我国国产密码算法的关键生态要素.日前,沃通CA子公司密信技术发布密信浏览器公测版,支持SM系列国密算法和安全协议 ...

  7. C# 实现国密SM3加解密封装

    1.Portable.BouncyCastle 引入 右键解决方案的引用,选择管理NuGet程序包 在浏览的搜索框中搜索:"Portable.BouncyCastle" 选择第一个 ...

  8. SM2 国密加密加签操作工具

    pom引入依bouncycastle赖 注意:bouncycastle版本过低会出现报错(我之前报错的的版本号1.60,修改后使用的1.68) <dependency><groupI ...

  9. SM2 (含SM3、SM4)国密算法工具QT版,彻底搞懂sm2算法的使用

    网上有很多网友问算法SM2怎么使用?什么是压缩公钥和非压缩公钥?xB和yB这参数是什么?怎么使用SM2做加解密?如何签名和验签?有没有工具来验证下? 这里分享个自己用QT造的一个小工具,简单好用,同时 ...

最新文章

  1. 设计模式 之美 -- 策略模式
  2. 操作系统学习2:操作系统的发展和概览
  3. easyui datagrid b表格中的内容显示null_扫盲 | 实际工作中,B 端设计都在做什么?...
  4. 非极大值抑制_非极大值抑制(Non-Maximum Suppression)
  5. RMAN异机复制数据库(不同路径)
  6. C#序列化和反序列化代码总结
  7. 计算机组成原理之指令和寻址方式
  8. cocos2dx arm64 jpg格式的不显示_如何导出CocosCreator项目供cocos2dx加载
  9. 前端多行文本溢出问题解决方案
  10. 【以前的空间】vijos 1720 阿狸的打字机
  11. 使用之后,谈谈国产芯片的体验
  12. HTML网页设计制作大作业(div+css)~ 环境保护(5个页面)
  13. openGL之glsl入门3--正弦函数叠加为方波
  14. 【递归入门】走迷宫(c++)
  15. [CF1504E]Travelling Salesman Problem
  16. Python制作短信发送程序
  17. UEFI开发探索82- YIE002USB开发板(05 制作HID设备)
  18. 关于win7下r3窗口进程保护的一些方式
  19. 【Java】虚拟机JVM
  20. netbeans8 EBJ模块中JPA部署问题

热门文章

  1. word点击退出时未保存怎么办?
  2. 股票杠杆哪个平台好?具备的资质是怎么样的?
  3. Python中的多线程是假的多线程
  4. Not creating XLA devices, tf_xla_enable_xla_devices not set错误求助
  5. VUE学习(一)、创建一个Vue应用。
  6. Win10系统打不开图片
  7. 2022最火土味情话文案
  8. Thinkpad E550/E450/T450/T450S黑苹果制作
  9. C语言记录按键次数,【视频】C语言实现键盘记录【c语言吧】_百度贴吧
  10. UI设计中的排版设计技巧