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

Web安全 - 基于 SM2/SM4 的前后端国产加解密方案详解

文章目录

  • 概述
  • 一、背景与法规要求
  • 二、算法选型
  • 三、核心流程
  • 四、前端实现要点(伪代码)
  • 五、后端实现要点(伪代码)
  • 六、公钥存储策略
  • 七、全流程示例图
  • 八、总结与最佳实践
  • 推荐

在这里插入图片描述


概述

随着信息安全法规日益严格,如《网络安全法》《数据安全法》和等保三级的落实,前后端通信中的敏感数据必须在传输层之上再加一层“国产加密”,才能满足合规与防护需求。接下来将以 SM2 与 SM4 为核心,详细剖析前端请求、后端处理及响应加密的全流程,并附示例代码,帮助读者快速落地。

一、背景与法规要求

  • 法规要求

    • 《网络安全法》《数据安全法》强调敏感数据加密存储与传输;
    • 等保三级对“重要信息系统”提出应用层加密需求。
  • 国产算法优势

    • SM2/SM4 系列为国家密码算法,已标准化并广泛验证;
    • 与通用算法(AES/RSA)兼容,便于渐进式升级。

二、算法选型

算法类型作用备注
SM2非对称用于交换对称密钥安全性强、计算效率适中
SM4对称用于加密具体业务数据性能优异,适合大数据量传输
AES对称兼容场景下的通用方案跨平台生态良好,可做备用或过渡方案

三、核心流程

阶段前端操作后端操作
初始化拉取后端 SM2 公钥生成 SM2 密钥对,并提供公钥接口
请求发送1. 生成随机 SM4 密钥
2. 用 SM4 加密业务数据
3. 用 SM2 公钥加密 SM4 密钥
4. 组装请求体
1. 用私钥解密获得 SM4 密钥
2. 用 SM4 解密业务数据
3. 业务处理
响应返回1. 用 SM4 加密响应 JSON
2. 可选:用私钥再 SM2 加密 SM4 密钥
3. 返回密文
前端解析1. (可选)用 SM2 公钥/私钥解密 SM4 密钥
2. 用 SM4 解密响应体

在这里插入图片描述
在这里插入图片描述

四、前端实现要点(伪代码)

  1. 公钥获取与存储

    // 初始化时调用
    async function fetchPublicKey() {const { data: { sm2PublicKey } } = await axios.get('/api/crypto/pubkey');// 建议存储在 Pinia 或 context 中store.commit('crypto/setPublicKey', sm2PublicKey);// 如需持久化,可选 localStoragelocalStorage.setItem('sm2PublicKey', sm2PublicKey);
    }
    
  2. 一次性 SM4 密钥生成

    import SM4 from 'sm-crypto/lib/sm4';function generateSM4Key() {// 16 字节随机密钥return window.crypto.getRandomValues(new Uint8Array(16)).join('');
    }
    
  3. 业务数据与密钥加密

    import SM2 from 'sm-crypto/lib/sm2';async function encryptRequest(payload) {const sm4Key = generateSM4Key();const sm2Pub = store.state.crypto.sm2PublicKey;const encryptedData = SM4.encrypt(JSON.stringify(payload), sm4Key);const encryptedKey = SM2.doEncrypt(sm4Key, sm2Pub);return { encryptedKey, encryptedData };
    }
    
  4. 封装与发送

    async function sendSecureRequest(api, payload) {const { encryptedKey, encryptedData } = await encryptRequest(payload);return axios.post(api, { key: encryptedKey, data: encryptedData });
    }
    

五、后端实现要点(伪代码)

以 Spring Boot 为例:

推荐使用Interceptor,这里仅是演示

@RestController
@RequestMapping("/api/secure")
public class SecureController {@Value("${crypto.sm2.private-key}")private String sm2PrivateKey;@PostMapping("/process")public ResponseEntity<?> process(@RequestBody SecurePayload payload) {// 1. 解密 SM4 密钥String sm4Key = SM2.decrypt(payload.getKey(), sm2PrivateKey);// 2. 解密业务数据String json = SM4.decrypt(payload.getData(), sm4Key);BusinessRequest req = objectMapper.readValue(json, BusinessRequest.class);// 3. 业务处理...BusinessResponse resp = service.handle(req);// 4. 加密响应String respJson = objectMapper.writeValueAsString(resp);String encryptedData = SM4.encrypt(respJson, sm4Key);return ResponseEntity.ok(Map.of("data", encryptedData));}
}

Tip:如需双向加密,可在响应里同时返回 encryptedKey: SM2.encrypt(sm4Key, clientPubKey)

六、公钥存储策略

  • 短期存储:Vue/Pinia 中维护,方便统一调用;
  • 持久化localStorage/sessionStorage,防止页面刷新导致丢失;
  • 安全性:SM2 公钥非机密,可安全保存在前端。

七、全流程示例图

FrontendBackendGET /api/crypto/pubkey{ sm2PublicKey }生成 SM4 密钥SM4 加密数据SM2 加密 SM4 密钥POST /process { key, data }SM2 解密 key → SM4KeySM4 解密 data → 业务数据业务处理SM4 加密响应{ data }SM4 解密 → 渲染FrontendBackend

八、总结与最佳实践

  • 密钥管理:后端妥善存储 SM2 私钥,使用 HSM 或环境变量;
  • 性能优化:SM4 加解密速度快,SM2 仅用于短字符串,加密开销可接受;
  • 兼容性:可与 AES/RSA 并行使用,逐步迁移;
  • 安全防护:配合 HTTPS,防止中间人;做好重放攻击检测(如加时间戳、随机串)。

推荐

https://gitee.com/lab1024/smart-admin

SmartAdmin 由 中国·洛阳 1024创新实验室 基于SpringBoot2/3+Sa-Token+Mybatis-Plus 和 Vue3+Ant Design Vue+Uni-App+Uni-UI,并以 「高质量代码」为核心,「简洁、高效、安全」的快速开发平台。

国内首个满足《网络安全-三级等保》、《数据安全》 功能要求,支持登录限制、接口国产加解密、数据脱敏等一系列安全要求。

前端提供 JavaScript和TypeScript双版本,后端提供 Java8+SpringBoot2.X和Java17+SpringBoot3.X 双版本。

同时 重磅开源 开源六年来 千余家企业验证过且正在使用 的代码规范: 《高质量代码思想》、《Vue3规范》、《Java规范》 ,让大家在这浮躁的世界里感受到一股把代码写好的清流!同时又能节省大量时间,减少加班,快乐工作,保持谦逊,保持学习,热爱代码,更热爱生活 !

在这里插入图片描述

http://www.dtcms.com/a/273661.html

相关文章:

  • Flutter优缺点
  • Java学习第三十二部分——异常
  • 【爬虫】- 爬虫原理及其入门
  • 【批量文件查找】如何从文件夹中批量搜索所需文件复制到指定的地方,一次性查找多个图片文件并复制的操作步骤和注意事项
  • 基于Python的豆瓣图书数据分析与可视化系统【自动采集、海量数据集、多维度分析、机器学习】
  • 从Excel到PDF一步到位的台签打印解决方案
  • 学习笔记(34):matplotlib绘制图表-房价数据分析与可视化
  • Java小白-String
  • Allegro 17.4操作记录
  • 平板柔光屏与镜面屏的区别有哪些?技术原理与适用场景全解析
  • 飞算JavaAI:重构Java开发的“人机协同”新范式
  • Python数据读写与组织全解析(查缺补漏篇)
  • 使用Spring Boot和PageHelper实现数据分页
  • 【MySQL】———— 索引
  • 【字节跳动】数据挖掘面试题0016:解释AUC的定义,它解决了什么问题,优缺点是什么,并说出工业界如何计算AUC。
  • 【理念●体系】从零打造 Windows + WSL + Docker + Anaconda + PyCharm 的 AI 全链路开发体系
  • SQL开窗函数
  • 5G IMS注册关键一步:UE如何通过ePCO获取P-CSCF地址
  • 微服务引擎 MSE 及云原生 API 网关 2025 年 6 月产品动态
  • 拓扑排序之 leetcode 207.课程表
  • 突破分子设计瓶颈:融合bVAE与GPU伊辛机的智能优化策略
  • Tomasulo算法是什么?
  • 【DataFlow】数据合成流水线工具
  • xFile:高性能虚拟分布式加密存储系统——Go
  • uniapp制作一个个人页面
  • Java结构型模式---组合模式
  • Elasticsearch混合搜索深度解析(下):执行机制与完整流程
  • 华为VS格行VS中兴VS波导随身WIFI6怎么选?流量卡OR随身WIFI,长期使用到底谁更香?
  • 从 0 到 1 玩转 upload-labs 靶场:环境搭建 + 全关卡漏洞解析
  • 零基础入门指南:华为数通认证体系详解