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.pswp.cn/bicheng/89090.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/89090.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/89090.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ACL動態路由實驗全攻略:配置與安全實戰

實驗拓撲圖 實驗需求 步驟1.按照圖示配置IP地址2.按照圖示區域劃分配置對應的動態路由協議3.在R7上配置dhcp服務器&#xff0c;能夠讓pc可以獲取IP地址4.將所有環回宣告進ospf中&#xff0c;將環回17宣告進rip中&#xff0c;將rip路由引rospf中&#xff0c;ospf路由引.rip中5.要…

電動汽車制動系統及其工作原理

制動系統是實現車輛減速、停車功能的重要系統。電動汽車的制動系統按照制動實現方式分為機械制動和電機再生制動&#xff0c;機械制動根據制動力實現方式不同又可分為液壓機械制動系統、氣壓機械制動系統和電子機械制動系統。目前&#xff0c;電動汽車的制動系統實現一般為協調…

CentOS 7 Linux 離線安裝 docker-compose

CentOS 7 Linux 離線安裝 docker-compose 1. docker-compose 簡介 1.1. docker-compose 是什么&#xff1f; docker-compose 是 Docker 官方提供的工具&#xff0c;用于定義和運行多容器 Docker 應用程序。通過一個 YAML 文件&#xff08;通常為 docker-compose.yml&#xf…

排序算法實戰(上)

一、引言在力扣刷題的旅程中&#xff0c;排序類題目是繞不開的重要板塊。今天就來分享兩道經典排序題——912. 排序數組和75. 顏色分類的解題思路與代碼實現&#xff0c;帶你深入理解排序算法在實際題目中的應用 。二、題目剖析與解題思路&#xff08;一&#xff09;912. 排序數…

python學智能算法(二十)|SVM基礎概念-感知機算法及代碼

引言 前序學習進程中&#xff0c;已經學習了超平面的基礎知識&#xff0c;學習鏈接為&#xff1a;超平面 在此基礎上&#xff0c;要想正確繪制超平面&#xff0c;還需要了解感知機的相關概念。 感知機 感知機是對生物神經網絡的模擬&#xff0c;當輸入信號達到感知機的閾值時…

操作HTML網頁

一、HTML網頁的介紹 HTML&#xff0c;即超文本標記語言&#xff08;HyperText Markup Language&#xff09;&#xff0c;它不是一種編程語言&#xff0c;而是一種標記語言&#xff0c;用于描述網頁的結構。HTML 通過一系列標簽來定義網頁中的各種元素&#xff0c;如文本、圖片…

Django--03視圖和模板

Django–03視圖和模板 Part 3: Views and templates 本教程承接第二部分&#xff0c;我們將繼續開發投票應用&#xff0c;重點介紹 Django 的表單處理和通用視圖。 文章目錄Django--03視圖和模板前言概述一、編寫更多視圖二、編寫實際執行操作的視圖三、快捷方式&#xff1a;r…

《每日AI-人工智能-編程日報》--2025年7月15日

介紹&#xff1a;AI &#xff1a;英偉達恢復向中國銷售 H20 并推出新 GPU&#xff1a;7 月 15 日&#xff0c;英偉達官宣將恢復向中國銷售 H20&#xff0c;并推出全新的 NVIDIA RTX PRO GPU&#xff0c;其中 B30 性能約為 H20 的 75%&#xff0c;定價在 6500 至 8000 美元之間&…

C++STL-list

一.基礎概念相當于數據結構里面的雙向鏈表二.基礎操作1.list對象創建1. 默認構造函數list<int> l1;2. 初始化列表list<int> l2_1 { 9,8,7,6,5 };list<int> l2_2({ 9, 8, 7, 1, 5 });3. 迭代器list <int> l3(l2_1.begin(), l2_1.end());4. 全0初始化li…

【PTA數據結構 | C語言版】字符串插入操作

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 請編寫程序&#xff0c;將給定字符串 t 插入到另一個給定字符串 s 的第 pos 個字符的位置。 輸入格式&#xff1a; 輸入先后給出主串 s 和待插入的字符串 t&#xff0c;每個非空字符串占一行&#…

Postman + Newman + Jenkins 接口自動化測試

??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】 【測試經驗】 【人工智能】 【Python】 </

CAS單點登錄架構詳解

目錄 概述核心概念 TGC (Ticket Granting Cookie)TGT (Ticket Granting Ticket)ST (Service Ticket) 架構設計 整體架構存儲架構安全機制 工作流程 完整登錄時序流程步驟詳解 技術實現 會話管理數據同步問題最佳實踐 參考資料 概述 CAS (Central Authentication Service) 是…

C++中正則表達式詳解和實戰示例

C 中的正則表達式&#xff08;Regular Expression&#xff09;主要通過標準庫 <regex> 提供&#xff0c;能夠用于字符串匹配、查找、替換、驗證格式等。它在 C11 中首次引入&#xff0c;并在 C14 和 C17 中逐步完善。一、頭文件和命名空間 #include <regex> #inclu…

深入解析Avro、Protobuf與JSON:序列化技術的選擇與應用

在現代分布式系統和數據交換場景中&#xff0c;序列化技術是數據存儲、傳輸和通信的核心。本文深入探討三種主流序列化技術&#xff1a;Avro、Protobuf 和 JSON&#xff0c;從背景、特點、示例代碼&#xff08;Python&#xff09;、優勢及最佳實踐等多個維度進行對比分析&#…

Vue 中 effectScope() 的全面解析與實戰應用

一、effectScope 概述1.1 什么是 effectScopeeffectScope() 是 Vue 3.2 引入的核心 API&#xff0c;用于創建副作用作用域容器。它能夠將多個響應式副作用&#xff08;如 watch、watchEffect 和 computed&#xff09;組織在一起&#xff0c;實現統一的生命周期管理。1.2 核心價…

嵌入式面試八股文(十六)·一文搞懂嵌入式常用名詞IC、ASIC、CPU、MPU、MCU、SoC、SoPC、GPU、DSP

目錄 1. IC&#xff08;Integrated Circuit&#xff0c;集成電路&#xff09; 2. ASIC&#xff08;Application-Specific Integrated Circuit&#xff0c;專用集成電路&#xff09; 3. CPU&#xff08;Central Processing Unit&#xff0c;中央處理器&#xff09; 4. M…

安全參綉25暑假第一次作業

第一天 1.首先講了d0cker的部署&#xff0c; 這個是第一個Vulhub漏洞環境。所有環境都使用D0cker容器化&#xff0c;使其易于部署和隔離測試。 其中&#xff0c;國內的阿里用不了&#xff0c;你得搞個代理&#xff0c;下國外的&#xff1a;入門指南 | Vulhub 然后按這個…

RocketMQ源碼級實現原理-消息消費總覽

Overview可以看到&#xff0c;pull message和consume message實際上是兩個過程&#xff0c;但是對于用戶是透明的 注意這三個Offset的含義&#xff0c;physical offset就是commitLog中的全局偏移量分發dispatch如上圖&#xff0c;Topic的每個queue&#xff0c;都綁定了唯一的一…

linux打包固件shell腳本

不打包 pack.sh解壓后無父目錄&#xff08;直接是文件&#xff09;生成 checksum.txt&#xff08;包含所有文件的 SHA256&#xff09;打包后 .tar.gz 移動到上級目錄#!/bin/bash# 檢查是否傳入版本號參數 if [ -z "$1" ]; thenecho "Usage: $0 <version> …

用uniapp開發鴻蒙應用(暫停更新-根據項目更新,現在項目未開始)

1.根據博客生成.hap文件 【鴻蒙HarmonyOS開發技巧&#xff1a;如何不依賴華為商店直接安裝uniapp生成的app文件&#xff1f;一鍵轉換app至hap格式教程詳解】_entry-default-signed.hap-CSDN博客 根據網絡查詢鴻蒙手機安裝測試app&#xff0c;需要電腦命令安裝 在鴻蒙HarmonyOS手…