react+vue 前端国密算法sm2、sm3 、sm4的js ts实现

柳絮泡泡 2024-06-16 17:03:01 阅读 56

1. 简单介绍下SM2 和 SM3

SM2 算法:是一种公钥加密算法,它的密钥长度为 256 位,安全性较高。可用于数字签名、密钥协商等场景。

SM3 算法:是一种对称加密算法,用于消息摘要和数字签名等场景。它的密钥长度为 256 位,安全性较高。SM3 算法与 SM2

算法相互配合,提高了整体安全性能。

2. 接下来讲前端如何实现

安装

npm install sm-cryptoyarn add sm-crypto sm2 、sm3 引入写法

require('sm-crypto').sm2 require('sm-crypto').sm3 SM2 非对称加密写法

str是需要加密的字符串

cipherMode // 1 - C1C3C2,0 - C1C2C3,默认为1

PUBLIC_KEY是后端给你的公钥,长度为130位,记住是以04开头

export function sm2Encrypt(str: string, cipherMode = 1) { const sm2 = require('sm-crypto').sm2; // 默认生成公钥 130 位太长,可以压缩公钥到 66 位 const compressedPublicKey = sm2.compressPublicKeyHex(PUBLIC_KEY); // compressedPublicKey 和 PUBLIC_KEY 等价 const encryptData = sm2.doEncrypt(str, compressedPublicKey, cipherMode); // 最后一步一定要记住再拼接04 return `04${encryptData}`;}

代码里面引入,加密密码sm2Encrypt(password,1) HMAC-SM3签名算法写法

data是签名加密数据,例如:账号+密码+时间戳(需要跟后端开发协商)

pwd是是第二个参数,我们这里要求的是传密码,要求为 16

进制串或字节数组,这里的strToHex方法就是将密码转为16进制

export function sm3Sign(data: string, pwd: string) { const sm3 = require('sm-crypto').sm3; return sm3(data, { key: strToHex(pwd) });}

将字符串转为16进制方法,我这里是自己封装了一个,还有很多方法可以实现转16进制,大家可以自己百度学习

export function strToHex(str: string) { var hexCharCode = []; for (var i = 0; i < str.length; i++) { hexCharCode.push(str.charCodeAt(i).toString(16)); } // 记住这里的join一定是空,不要误打了空格 return hexCharCode.join('');}

代码里面引入sm3Sign(name+password+timestamp, password)

参考链接:sm2 sm3 sm4 加密实现

校验工具:在线加密解密工具



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。