SM2国密——前端加密,后端解密(备忘)

SM2椭圆曲线公钥密码算法--密钥对与数字签名 SM2算法全称是SM2椭圆曲线公钥密码算法(SM是商用密码的拼音缩写),是一种基于“椭圆曲线”的密码ECC(Elliptic Curve Cryptography)。2016年,SM2成为中国国家密码标准。 在商用密码体系中,SM2主要用于替换RSA加密算法。主要介绍SM2国密密钥对与数字签名算法原理。 阅读详情
AI摘要

本文详细介绍了如何使用SM2加密算法在前端和后端之间安全地传输用户名和密码。首先,通过Java代码生成公钥和私钥,公钥发送给前端,私钥保留在后端。前端利用公钥对密码进行加密,然后将加密后的数据发送给后端。后端接收到加密数据后,使用私钥进行解密,从而实现安全的数据传输,避免明文传输的风险。整个过程结合了JavaScript库CryptoJS和SM2.js来完成加密和解密操作。

问题:前端提交请求时,用户名及密码到后台的过程明文传输,不安全,所以通过对账号和密码进行SM2加密后再进行提交,后台接收后再进行解密获取。

SM2加密知识:https://blog.youkuaiyun.com/mogoweb/article/details/105108689

SM2代码和文章借鉴源地址:    https://blog.51cto.com/boytnt/2503384

                                        https://github.com/Saberization/SM2

正文:

总的来说就是通过一定的算法获取到两个密钥,一个叫公钥,一个叫私钥。公钥留给前端进行进行加密,私钥留给后端进行解密。

首先先添加maven依赖:(最好使用1.60之后的版本,1.56版本测试缺少包)

        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15on</artifactId>
            <version>1.67</version>
        </dependency>

然后公钥给前端之前,我们需要先生成公钥和私钥(不用问,借鉴来的(老脸一红)):

        X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1");
        ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), sm2ECParameters.getG(), sm2ECParameters.getN());
        ECKeyPairGenerator keyPairGenerator = new ECKeyPairGenerator();
        keyPairGenerator.init(new ECKeyGenerationParameters(domainParameters, SecureRandom.getInstance("SHA1PRNG")));
        AsymmetricCipherKeyPair asymmetricCipherKeyPair = keyPairGenerator.generateKeyPair();

//上面的代码都是直接用maven依赖中的包直接import就可以用了
//还有一些更底层的写法,可以自己搜索一下,图方便的这个挺好的


        //私钥,16进制格式,自己保存
        BigInteger privatekey = ((ECPrivateKeyParameters) asymmetricCipherKeyPair.getPrivate()).getD();
        String privateKeyHex = privatekey.toString(16);
        System.out.println("private Key :" + privateKeyHex);

        //公钥,16进制格式,发给前端
        ECPoint ecPoint = ((ECPublicKeyParameters) asymmetricCipherKeyPair.getPublic()).getQ();
        String publicKeyHex = Hex.toHexString(ecPoint.getEncoded(false));
        System.out.println("Public Key :" + publicKeyHex);

这个时候,我们手持公钥和私钥,大手一挥,扔给前端一个公钥。

前端说,你等等,我先准备一下:

然后就添加了这两个js

<script type="text/javascript" src="自己的地址/crypto-js.js"></script>
<script type="text/javascript" src="自己的地址/sm2.js"></script>

        var psd = $('#password').val();
        var publichex = '后端获取到的公钥写这块';
		var password = sm2Encrypt(psd,publichex,0);

前端通sm2Encrypt加密完成后,现在的password就是一大串字符 。

然后这时候给后端,提交过程中就算你获取到了你也解不开,因为你没有私钥~~~

后端呢,获取到了一大串字符的password之后,就开始进行解密(还是借鉴来的代码(稍作更改)):

        String cipherData = "从前端获取的加密后的字符串";
		byte[] cipherDataByte = Hex.decode(cipherData);

		//刚才的私钥Hex,先还原私钥
		String privateKey = "先前获取的私钥写在这里";
		BigInteger privateKeyD = new BigInteger(privateKey, 16);
		X9ECParameters sm2ECParameters1 = GMNamedCurves.getByName("sm2p256v1");
		ECDomainParameters domainParameters1 = new ECDomainParameters(sm2ECParameters1.getCurve(), sm2ECParameters1.getG(), sm2ECParameters1.getN());
		ECPrivateKeyParameters privateKeyParameters = new ECPrivateKeyParameters(privateKeyD, domainParameters1);

		//用私钥解密
		SM2Engine sm2Engine = new SM2Engine();
		sm2Engine.init(false, privateKeyParameters);

		//processBlock得到Base64格式,记得解码
		byte[] arrayOfBytes =Base64.decodeBase64(sm2Engine.processBlock(cipherDataByte, 0, cipherDataByte.length));

		//得到明文:SM2 Encryption Test
		String data = new String(arrayOfBytes);

这个时候就获得了前端界面提交上来的密码,并且传输过程中现实的是一串16进制的字符串,解决了明文传输,实现了加密传输的问题。

等保要求,密码必须使用SM2加密传输 根据等保要求,密码必须使用SM2加密传输。 阅读详情

相关推荐

国密SM2前端加密,Java后台解密问题

背景:要实现请求参数加密的功能,使用的是国密SM2算法,前端想后台发送请求获取公钥,将请求加密发送到后台,后台用对应的私钥进行解密 问题:前端进行加密的请求,后台无法进行解析 解决方案:(此处所用的类都为Hutool里的工具类) 当前的前端的SM2加密js库都是使用SM2公钥的q值转成16进制进行加密,所以在后台给前端发送公钥时,需要提取公钥的q值并且转成16进制 UserPrivateKey userPrivateKey; KeyPair pair = Secure

ww_1997的博客 8085

国密算法SM2加密解密

一、依赖包 <!-- hutool的 SM2 加密--> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15to18</artifactId> <version>1.68</version> &l

qq_37634156的博客 1万+

SM2加解密问题总结,并整理SM2,SM3,SM4,前端JS加密,后端解密

直接上代码 function sm2Encrypt(data, publickey, cipherMode) { cipherMode = cipherMode == 0 ? cipherMode : 1; // msg = SM2.utf8tob64(msg); var msgData = CryptoJS.enc.Utf8.parse(data); // 有的js不会注释下面装换过程,我尝试下了下,不注释掉后端解码会出问题 // msgData = CryptoJS.e

aCheng的博客 6899

国密SM2算法进行数据的加密、签名和验签、解密

国密SM2算法的研究使用(springboot环境)

卓越之识论道,平常之识论事,狭隘之识论人 4万+

JAvA前端密码加密码后端解密_国密SM2的前端加密,后端解密(Java版本)及SM3 摘要加密...

一、简介国密即国家密码局认定的国产密码算法。常用的主要有SM2,SM3,SM4。SM2:椭圆曲线公钥密码算法是我国自主设计的公钥密码算法,为非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。SM3:消息摘要。可以用MD5作为对比理解。该算法已公开。校验结果为256位。SM4:对称加密,密钥长度和分组长度均为128位。由于国际环境(与美国的关系),我...

weixin_39748183的博客 2500

前端后端的SM2国密加密解密

前后端使用sm2加解密,

weixin_43617604的博客 2730

前端sm2国密加密解密

1.下载国密包2.获取后端的公钥注sm-crypto使用BC库加解密前端密钥与后端密钥是两队,非常规的base64密钥前端公钥需要在前面加04占位否则无法解密3.前端使用公钥进行加密生成的加密串加04方便后端解密/**4.前端使用私钥解密。

m0_59598029的博客 3209

3分钟接入满血版DeepSeek-R1:字节火山引擎手把手教程!免费50万tokens!

3分钟接入满血版DeepSeek-R1:字节火山引擎手把手教程!免费50万tokens!

hunteritself的博客 2万+

SpringBoot+vue集成sm2国密加密解密

Gitee仓库/demo-exer说明:前端vue工具类和库在resources目录下。本章节实现思路:后端基于Hutool开源工具提供的SmUtil来完成国密加解密,前端使用sm-crypto来实现加解密。国密算法工具-SmUtilsm-crypto。

每个人都是独一无二的,把握好自己的节奏,跟着自己的心走。 4334

Mac用户必看:PD虚拟机网络初始化失败的3分钟修复指南(附详细截图)

本文针对Mac用户在Parallels Desktop(PD虚拟机)启动时遇到的“网络初始化失败”问题,提供了快速诊断与修复指南。核心原因是macOS系统更新后权限未正确授予。文章通过详细的三步修复法(关闭进程、修改配置文件、重新授权重启),帮助用户在3分钟内恢复虚拟机网络连接,并附有排查清单与预防建议。

weixin_29231027的博客 537

CVE-2017-7921漏洞深度剖析:从身份验证绕过到实战复现与防御

身份验证是Web应用安全的核心防线,其逻辑缺陷可能导致严重的未授权访问。身份验证绕过漏洞的原理在于,应用程序对特定请求路径或API接口的访问控制策略存在疏漏,未能执行有效的会话或令牌校验。这类漏洞的技术价值在于,攻击者无需凭证即可直接访问受保护的后端资源,从而获取敏感信息或执行未授权操作,对系统机密性、完整性构成直接威胁。在物联网和安防监控领域,大量网络摄像头、录像机等设备暴露于公网,其Web管理界面便成为常见攻击面。本文聚焦于安防设备中一个经典的CVE-2017-7921身份验证绕过漏洞,通过剖析其技术原

WGH100817的博客 469

跨语言国密SM2加密解密实战:JavaScript与Python互通指南

通过本文的实战演练,我们成功实现了JavaScript与Python的SM2加密解密互通。密钥格式统一:确保两端使用同一套密钥对,且格式一致。加密模式统一:推荐使用国密标准的C1C3C2模式。编码一致:建议统一使用十六进制字符串传输密文。未来,随着国密算法的普及和生态完善,SM2将在更多场景中替代国际算法,成为数据安全的中坚力量。开发者应积极拥抱国密,为国产化替代贡献力量。参考文献sm-crypto官方文档gmssl-python官方仓库优快云博客《SM2加解密(JS与Java互通)》

未来已来,AI时代,学AI编程,做AI量化,就来大鹏AI教育。 1614

工厂自动化布线实战:从功率计算到线槽布局的完整避坑指南

本文详细介绍了工厂自动化布线的实战经验,从功率计算到线槽布局的完整避坑指南。通过三步计算法确定线径需求,强调电压降控制的重要性,并分享线槽布局的50%法则和强弱电分离技巧。特别针对移动设备和多芯信号线提供专业解决方案,帮助工程师避免常见错误,提升布线效率和质量。

weixin_29266007的博客 351

SM2国密算法加解密

接口安全设计原则的一个点就是数据不能明文传输,除了https这个必须的请求外,接口数据加密也是一个重要的方式,下面介绍一下SM2国密算法加解密的使用方式。这里我就针对目前前后端分离架构的方式来简单介绍一下如何正确使用SM2算法对数据进行加解密,介绍分为后端加解密和前端加解密。

active_pig的博客 1万+

VS2015+Qt+OpenCV+open62541开发过程(05_VS2015中使用OPCUA open62541通过Kepware读写PLC数据)

此外还需要所需lib包:WS2_32.Lib(opcua通讯用到的库,opcua使用socket通讯,需使用此库),添加#pragma comment(lib,"ws2_32.lib") 语句,有的文章说需要添加ws2_32.lib文件或ws2_32.dll到项目资源中,貌似影响不大。2.在VS中选择x64平台会报错,选择x86平台可以用,应该是ws2_32.lib相关的库不支持64位,目前没有解决,继续后面的实验,看看用Qt后是否可以解决。6.VS中建立的变量,与读取的OPC点数据类型注意对应。

zzh17的博客 1862

攀藤PMS系列传感器STM32驱动开发与数据解析实战

本文详细介绍了攀藤PMS系列传感器与STM32微控制器的驱动开发与数据解析实战,涵盖硬件连接、数据协议解析、驱动源码编写及数据处理优化。重点解析了传感器数据帧结构,提供了完整的STM32驱动实现代码,并分享了实际应用中的问题排查与性能优化经验,帮助开发者快速实现高精度颗粒物浓度检测。

milk8的博客 347

三步实现Java的SM2前端加密后端解密

三步实现Java的SM2前端加密后端解密

秦无解的博客 1万+

word多级列表为什么会变成黑块解决思路

今天在写文档时,发现WORD5级的标题都变黑块了,找了度娘的资料,终于解决了。 第一种 1、光标bai放在黑快的右边,按向左的箭头,然后ctrl+shift+s,点击重新应用。 2、点击“定义新的多级列表”(不知道从哪儿找这个按钮的百度下),直接点确定。 3、这里很重要!!!不要直接保存,而是直接关掉word,会提示保存还是不保存,这个地方再点击保存。 第二种 Word2016 使用宏代码修复方法 1.找到视图-宏,打开 查看宏 2.创建宏 3.贴...

霍力强的专栏 8580

前端国密加解密使用方法SM2、SM3、SM4

前端国密加解密使用方法SM2、SM3、SM4 ,使用方法介绍

KO_____KO的博客 1万+

CUDA编程00 - 配置CUDA开发环境

第一步:在一台装有Nvidia显卡和驱动的机器上,用nvidia-smi命令查看显卡所支持cuda版本。安装时按提示下一步即可,安装完成用 nvcc -V 命令检查是否成功。第二步: 到Nvidia官网下载CUDA Toolkit并安装,第三步:编写HelloWorld。

GPU全栈博主 1359

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

js加密双重保障之sm2国密

​ 最近看到一些项目里边有用到sm2/3/4国密加密算法,这里给大家简单介绍一下。

mxd01848的博客 5408

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

彻底搞懂Snowy国密插件:前端smCrypto.js与后端加密服务协同实战

Snowy是国内首个国密前后分离快速开发平台,采用Vue3+AntDesignVue3+Vite+SpringBoot技术栈,集成国密加解密插件,实现前后端数据传输全程加密。本文将详解Snowy国密插件的核心实现,包括前端smCrypto.js工具类与后端加密服务的协同机制,帮助开发者快速掌握国密算法在项目中的落地应用。 ## Snowy国密插件技术架构解析 Snowy的国密加密体系是其核心安

gitblog_00886的博客 950

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

JS实现国密算法SM2加密,后端Java解密

项目涉及保密传输,要求使用国密算法,一般遇到类似问题首先想到的就是使用非对称加密,后端生成密钥对,将公钥交给前端,前端用公钥加密数据,后端用私钥对数据解密。项目的复杂度在于国密的非对称加密算法SM2的Java及JS实现。 Java版比较好办,较新版本的bouncycastle就支持了SM2/SM3/SM4,麻烦在于JS版,找了很多都有问题,直到遇到了这个项目:https://github.com/Saberization/SM2,感谢作者。分别整理下前端后端的实现过程: 后端首先引入bouncyc.

qq_38472635的博客 7133

前端使用国密sm2和sm4进行加解密

前端是用sm2加密解密

zjq_1234的博客 8559
上一篇: 对IOC(控制反转)的理解
下一篇: 日常Bug—盘符问题
黄焖大排骨
博客等级 码龄8年 52粉丝 19原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值