文章目錄
- 概述
- 一、背景與法規要求
- 二、算法選型
- 三、核心流程
- 四、前端實現要點(偽代碼)
- 五、后端實現要點(偽代碼)
- 六、公鑰存儲策略
- 七、全流程示例圖
- 八、總結與最佳實踐
- 推薦

概述
隨著信息安全法規日益嚴格,如《網絡安全法》《數據安全法》和等保三級的落實,前后端通信中的敏感數據必須在傳輸層之上再加一層“國產加密”,才能滿足合規與防護需求。接下來將以 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 解密響應體 | — |
四、前端實現要點(偽代碼)
-
公鑰獲取與存儲
// 初始化時調用 async function fetchPublicKey() {const { data: { sm2PublicKey } } = await axios.get('/api/crypto/pubkey');// 建議存儲在 Pinia 或 context 中store.commit('crypto/setPublicKey', sm2PublicKey);// 如需持久化,可選 localStoragelocalStorage.setItem('sm2PublicKey', sm2PublicKey); }
-
一次性 SM4 密鑰生成
import SM4 from 'sm-crypto/lib/sm4';function generateSM4Key() {// 16 字節隨機密鑰return window.crypto.getRandomValues(new Uint8Array(16)).join(''); }
-
業務數據與密鑰加密
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 }; }
-
封裝與發送
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 公鑰非機密,可安全保存在前端。
七、全流程示例圖
八、總結與最佳實踐
- 密鑰管理:后端妥善存儲 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規范》 ,讓大家在這浮躁的世界里感受到一股把代碼寫好的清流!同時又能節省大量時間,減少加班,快樂工作,保持謙遜,保持學習,熱愛代碼,更熱愛生活 !