当前位置: 首页 > news >正文

基于国密 SM3/SM4/SM2 的前后端数据完整性校验实战(附完整代码)

基于国密 SM3/SM4/SM2 的前后端数据完整性校验实战(附完整代码)

在政务、金融、电力等关键领域,数据在传输过程中不仅要保证机密性(不被窃取),还要保证完整性(不被篡改)。国密算法(SM2/SM3/SM4)作为国内标准,正被越来越多项目采用。本文将以一个真实项目中的前端代码为例,深入解析如何利用 SM2、SM4、SM3 实现一套完整的请求加密与数据完整性校验方案,并提供可直接复用的核心代码与实现思路。

一、为什么需要“加密+完整性校验”?

  • 加密(SM4):保证数据不会被中间人看到,解决机密性问题。
  • 完整性校验(SM3):保证数据在传输过程中没有被篡改,解决防篡改问题。
  • 密钥安全交换(SM2):使用非对称加密安全传递对称密钥,避免密钥暴露。

三者结合,形成了一套端到端的安全通信机制,即使在 HTTPS 之外也能提供额外保护。

二、整体架构与数据流

前端 后端 1. 生成 SM4 密钥(key)和 IV 2. 用 SM2 公钥加密 key 和 IV → 放入请求头 3. 用 SM4 加密业务数据 → 得到密文 body 4. 用 SM3 计算密文的哈希 → 放入请求头 5. 生成 timestamp + nonce,SM3 签名 → 放入请求头 6. 发送请求(头 + 密文body) 7. 用 SM2 私钥解密出 SM4 密钥 8. 校验 timestamp 和 nonce(防重放) 9. 用 SM3 校验密文完整性 10. 用 SM4 解密得到业务数据 11. 处理业务,返回响应(同样加密+完整性) 12. 收到响应,校验响应完整性,解密得到业务数据

三、前端核心代码解析(基于 Axios 拦截器)

以下代码来自真实项目,我将逐段解释其核心逻辑。

3.1 国密库引入与配置

import{sm4asSM4}from'gm-crypt'// 假设 smEncrypt 是一个封装了 SM2/SM3 的全局对象constsm3=smEncrypt.sm3

说明gm-crypt是 Node.js 环境下常用的 SM4 加密库;smEncrypt通常来自第三方国密 SDK,提供 SM2 加密和 SM3 哈希方法。实际开发中可根据技术栈选择对应的库(如sm-crypto)。

3.2 生成随机字符串与签名头(防重放)

/** 生成12位不重复随机字符串(用于 X-Nonce) */constgetUniqueNonce=()=>{const$chars='ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'constarr=$chars.split('')for(leti=arr.length-1;i>0;i--){constj=Math.floor(Math.random()*(i+1));[arr[i],arr[j]]=[arr[j],arr[i]]}returnarr.slice(0,12).join('')}/** 生成请求签名头 X-Timestamp、X-Nonce、X-Signature */constgetSignatureHeaders=()=>{consttimestamp=Date.now().toString()constnonce=getUniqueNonce()constsignature=sm3(timestamp+nonce)// SM3 签名return{'X-Timestamp':timestamp,'X-Nonce':nonce,'X-Signature':signature}}

核心要点

  • 时间戳 + 随机数拼接后做 SM3 哈希,得到签名。
  • 后端会校验时间戳是否在允许范围内(如5分钟),并检查 nonce 是否已被使用(需用 Redis 缓存),从而防止重放攻击。

3.3 动态生成 SM4 密钥与 IV,并用 SM2 公钥加密

constgetAesKey=function(len=32){const$chars='ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'constmaxPos=$chars.lengthletkeyStr=''for(leti=0;i<len;i++){keyStr+=$chars.charAt(Math.floor(Math.random()*maxPos))}returnkeyStr}constaeskey=getAesKey().substring(0,16)// SM4 密钥(16字节)constaesiv=
http://www.cnnetsun.cn/news/1430062.html

相关文章:

  • 【2026年最新600套毕设项目分享】springboot健康菜谱生成系统(14221)
  • 安卓手机网络共享给MacBook (M1芯片)
  • 3个智能交易技巧:Steam-Economy-Enhancer让库存管理效率提升87%
  • Qwen3-ASR-1.7B在医疗场景的应用:电子病历语音录入系统
  • 我也没想到,Java开发 API接口可以不用写 Controller了
  • 数值特征工程中的四种缩放方法:原理、适用场景与局限性
  • HereSphere VR播放器下载地址与使用教程(Meta Quest 2/3可用)Meta Quest播放器、HereSphere下载、VR视频播放器推荐、Quest 3看片工具、VR本地播放器、
  • 【收藏】500+ AI工具导航,这一站搞定你的AI工具箱!
  • FireRedASR-AED-L代码实例:Python调用FireRedASR-AED-L模型核心接口
  • airPLS算法突破:自适应迭代加权惩罚最小二乘法革新基线校正技术
  • [C语言]指针简介
  • AS3935闪电传感器驱动开发与嵌入式实战指南
  • 如何快速实现Android数据持久化:Tape文件队列库的完整指南
  • 从0到1理解RTAB-Map技术原理:SLAM技术与3D建图实战指南
  • SiameseUIE中文-base实战案例:从微信公众号推文中抽取活动时间与地点
  • 手把手教你用RealSense D435i进行IMU标定(附常见错误解决方案)
  • 4大核心价值解锁帧率自由:genshin-fps-unlock工具全场景技术指南
  • SeqGPT-560M与IDEA集成:智能Java开发环境搭建
  • SeqGPT-560M与卷积神经网络结合:文本与图像的多模态分析
  • 终极Revery动画曲线设计指南:物理引擎的应用实例详解
  • SUNFLOWER MATCH LAB C盘清理与模型存储优化:释放本地开发空间
  • PyTorch分布式训练实战:从DP到DDP的进阶指南
  • Verilog移位操作避坑指南:为什么你的有符号数右移总出错?
  • Silicon终极指南:如何快速创建惊艳的源代码图像
  • [特殊字符] Local Moondream2个性化应用:构建个人专属图像知识库
  • Phi-3-mini-128k-instruct实操手册:Chainlit前端添加对话导出为Markdown/PDF
  • AI 净界企业应用场景:高效生成表情包与贴纸素材
  • nlp_structbert_siamese-uninlu_chinese-base实战手册:schema版本管理与灰度发布策略
  • 仓储空间动态建模与全流程空间认知计算关键技术攻关与系统实现—— 融合镜像视界 Pixel-to-Space、多视角视频融合、动态三维重构、无感定位与轨迹建模的空间计算引擎
  • docxtemplater故障排除指南:5大故障类型与12种解决方案全解析