前端使用国密sm2和sm4进行加解密代码示例

 更新时间:2025年04月09日 09:46:17   作者:喜欢代码的新之助  
在前端实现加密算法时,需要特别注意密钥的安全存储和管理,不应将敏感的密钥硬编码在前端代码中,这篇文章主要介绍了前端使用国密sm2和sm4进行加解密的相关资料,需要的朋友可以参考下

国密SM加密

  • 国密SM:国密算法,即国家商用密码算法。是由国家密码管理局认定和公布的密码算法标准及其应用规范,其中部分密码算法已经成为国际标准。如SM系列密码,SM代表商密,即商业密码,是指用于商业的、不涉及国家秘密的密码技术。

安装SM加密依赖

npm install --save sm-crypto
或
npm install --save sm-crypto --legacy-peer-deps   

SM2

封装

  • 将sm2的加密解密方法进行封装,文件命名为sm2.js
    // 引入
    const sm2 = require('sm-crypto').sm2
    const cipherMode = 0 // 1 - C1C3C2,0 - C1C2C3,默认为1
    
    // 后端会生成密钥对
    // publicKey:公钥 后端提供
    // privateKey:私钥 后端提供
    const publicKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    const privateKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    
    // 加密
    // value:需要加密的内容
    export function encrypt (value) {
    	// 给后端传值时需要在加密的密文前面加04 ,这样后端才能解密正确不报错
    	return '04' + sm2.doEncrypt(value, publicKey, cipherMode)
    }
    
    // 解密
    // value:需要解密的密文
    export function decrypt (value) {
    	// 后端传输过来的密文开头的两个字符通常也为04,因此解密时需要删除
    	return sm2.doDecrypt(value.slice(2, value.length), privateKey, cipherMode)
    }
    

使用

	// 引入sm2.js,注意文件路径不要出错
	import { encrypt, decrypt } from './sm2'

	// data:需要加密的数据
	// encryptData:加密后的密文
	// 若有需要则将js对象转换为字符串后进行加密:JSON.stringify(data)
	const encryptData = encrypt(JSON.stringify(data))

	// data:需要解密的密文
	// decryptData:解密后的数据
	// 若解密结果为json字符串,则可以通过JSON.parse()方法将解密结果转化为json对象
	const decryptData = decrypt(data)

SM4

封装

  • 将sm4的加密解密方法进行封装,文件命名为sm4.js

    const SM4 = require("sm-crypto").sm4;
    
    const pwdKey = "xxxx"; //密钥 前后端一致,后端提供
    let sm4Config = {
      key: pwdKey,
      mode: "ecb",  // 加密的方式有两种,ecb和cbc两种,看后端如何定义的,cbc需要iv参数,ecb不用
      iv: '1234567891011121', // 初始向量,cbc模式的第二个参数,也需要跟后端配置的一致
      cipherType: "base64"
    };
    
    const sm4Util = new SM4(sm4Config); // new一个sm4函数,将上面的sm4Config作为参数传递进去。
        
    /* 
     * 加密工具函数
     * @param {String} text 待加密文本
     */
    export function encrypt(text) {
      return sm4Util.encrypt(text, pwdKey);
    }
    
    /*
     * 解密工具函数
     * @param {String} text 待解密密文
     */
     export function decrypt(text) {
      return sm4Util.decrypt(text, pwdKey);
    }
    

使用

	// 引入asm4.js,注意文件路径不要出错
	import { encrypt,decrypt } from "./sm4"

	// data:需要加密的数据
	// encryptData:加密后的密文
	// 若有需要则将js对象转换为字符串后进行加密:JSON.stringify(data)
	const encryptData = encrypt(JSON.stringify(data))

	// data:需要解密的密文
	// decryptData:解密后的数据
	// 若解密结果为json字符串,则可以通过JSON.parse()方法将解密结果转化为json对象
	const decryptData = decrypt(data)

总结 

到此这篇关于前端使用国密sm2和sm4进行加解密的文章就介绍到这了,更多相关前端国密sm2和sm4加解密内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • javascript URL锚点取值方法

    javascript URL锚点取值方法

    url取值的比较不错的思路,一般都是这样的话,或直接先将?替换成统计分隔符,js数组一定要特别熟悉。
    2009-02-02
  • JS模式之单例模式基本用法

    JS模式之单例模式基本用法

    这篇文章主要介绍了JS模式之单例模式基本用法,实例分析了javascript单例模式的基本实现方法,需要的朋友可以参考下
    2015-06-06
  • js实现无缝滚动特效

    js实现无缝滚动特效

    这篇文章主要介绍了js实现无缝滚动特效,结合已学知识进行扩展性练习,感兴趣的朋友可以参考一下
    2015-12-12
  • javascript函数式编程程序员的工具集

    javascript函数式编程程序员的工具集

    函数式编程语言一向被认为是比其它编程语言更高深的语言。一是因为函数式编程语言的语法很另类,比如Lisp语言,二是因为函数式编程语言都很古老,比如Schema语言。在如今面向对象语言大行其道的时代,函数式编程语言有其特殊的优势
    2015-10-10
  • Javascript 实用小技巧

    Javascript 实用小技巧

    都是一些非常不错的js 小技巧,学习js的朋友一定要看下,有很多不错的代码。
    2010-04-04
  • JavaScript制作简单网页计算器

    JavaScript制作简单网页计算器

    这篇文章主要为大家详细介绍了JavaScript制作简单网页计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 微信小程序实现的图片保存功能示例

    微信小程序实现的图片保存功能示例

    这篇文章主要介绍了微信小程序实现的图片保存功能,结合实例形式分析了微信小程序wx.downloadFile({})及wx.saveImageToPhotosAlbum({})函数图片保存功能相关使用技巧,需要的朋友可以参考下
    2019-04-04
  • JS模拟并美化的表单控件完整实例

    JS模拟并美化的表单控件完整实例

    这篇文章主要介绍了JS模拟并美化的表单控件实现方法,涉及javascript结合css样式美化表单的功能,非常美观实用,需要的朋友可以参考下
    2015-08-08
  • JS简单生成随机数(随机密码)的方法

    JS简单生成随机数(随机密码)的方法

    这篇文章主要介绍了JS简单生成随机数(随机密码)的方法,简单分析了javascript随机数相关函数并结合具体实例形式分析了随机数的相关生成技巧,需要的朋友可以参考下
    2017-05-05
  • JavaScript获取数组最后一个元素的3种方法以及性能

    JavaScript获取数组最后一个元素的3种方法以及性能

    在开发过程中,我们常常需要得到js数组的最后一个数组元素,下面这篇文章主要给大家介绍了关于JavaScript获取数组最后一个元素的3种方法以及性能,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06

最新评论