為什么要用混合加密系統(tǒng)?
基于 非對稱加密技術(shù) 解決了密鑰配送問題,但是非對稱加密有兩個問題:
- 非對稱加密 處理速度不如 對稱加密;
- 無法抵御 中間人攻擊;(指攻擊者與通訊的兩端分別建立獨(dú)立的聯(lián)系,并交換其所收到的數(shù)據(jù),使通訊的兩端認(rèn)為他們正在通過一個私密的連接與對方直接對話,但事實(shí)上整個會話都被攻擊者完全控制)
采用混合加密系統(tǒng),就能完美解決問題1,但無法解決問題2,需要用到證書(證書不是本文的重點(diǎn))。
當(dāng)然,混合加密系統(tǒng),還有如下好處:
- 高效性與性能優(yōu)化
- 對稱加密處理數(shù)據(jù):對稱加密(如AES)計算速度快,適合加密大量數(shù)據(jù)(如文件、通信內(nèi)容)。
- 非對稱加密管理密鑰:非對稱加密(如RSA、ECC)用于安全交換對稱密鑰,避免了對稱加密的密鑰分發(fā)問題。
- 資源消耗低:僅在密鑰交換階段使用計算密集的非對稱加密,后續(xù)通信由高效的對稱加密完成,節(jié)省計算資源。
- 安全的密鑰分發(fā)
- 解決密鑰交換難題:對稱加密的密鑰通過非對稱加密傳輸(如用接收方的公鑰加密),確保即使通信被監(jiān)聽,攻擊者也無法獲取密鑰。
- 前向保密(Forward Secrecy):若使用臨時密鑰(如Diffie-Hellman的臨時密鑰對),即使長期私鑰泄露,歷史會話仍無法解密。
- 靈活性與兼容性
- 適應(yīng)不同場景:可靈活選擇對稱和非對稱算法(如AES+ECC或ChaCha20+RSA),滿足不同協(xié)議(TLS、PGP)的需求。
- 支持多重功能:非對稱加密還可用于數(shù)字簽名、身份認(rèn)證等,與對稱加密無縫結(jié)合。
- 增強(qiáng)的安全性
- 雙重防護(hù):攻擊者需同時破解對稱密鑰和非對稱私鑰,難度極高。
- 動態(tài)密鑰管理:每次會話生成唯一的對稱密鑰(會話密鑰),減少長期密鑰泄露風(fēng)險。
- 擴(kuò)展性與易用性
- 大規(guī)模部署:公鑰基礎(chǔ)設(shè)施(PKI)支持多用戶環(huán)境,非對稱加密的公鑰可公開分發(fā),無需預(yù)共享密鑰。
- 移動設(shè)備友好:對稱加密的低計算需求適合手機(jī)、IoT設(shè)備等資源受限的環(huán)境。
- 前向保密(Perfect Forward Secrecy, PFS)
- 通過臨時密鑰交換機(jī)制(如ECDHE),即使服務(wù)器私鑰未來被泄露,過去的會話仍無法被解密,顯著提升長期安全性。
總結(jié):
混合密碼系統(tǒng)結(jié)合了對稱加密和非對稱加密兩者的優(yōu)勢,在安全性、效率和實(shí)用性之間實(shí)現(xiàn)了平衡。
實(shí)際應(yīng)用示例:
- HTTPS/TLS:客戶端生成隨機(jī)對稱密鑰,用服務(wù)器的公鑰加密后傳輸,后續(xù)通信使用對稱加密。
- PGP/GPG:用接收方的公鑰加密對稱會話密鑰,再使用該會話密鑰加密郵件內(nèi)容。
- SSH:非對稱加密驗(yàn)證身份后,協(xié)商對稱密鑰用于數(shù)據(jù)傳輸。
加密流程
- 生成隨機(jī)數(shù)做對稱密鑰;
- 用對稱密鑰加密提高速度;
- 用公鑰加密保護(hù)對稱密鑰;

解密流程
- 用私鑰解密對稱密鑰;
- 用對稱密鑰解密密文;

Reference
https://blog.csdn.net/Octopus21/article/details/109335708
一個前后端的加密過程
加密流程時序圖
# 背景知識
|| 是拼接符號,案例如下:
如果a是101,b是110,
那么h(a||b)=h(101110)。
sequenceDiagram
note right of Client: 加密流程
Client->>Servers: Get SM2 Public Key
Servers->>Client: Return SM2 Public Key
Client->>Client: Create SM4 Key
Client->>Client: ciphertext_1 = SM4 Encrypt(SM4 Key, plaintext_1)
Client->>Client: ciphertext_2 = SM2 Encrypt(SM2 Public Key, SM4 Key||plaintext_1)
Client->>Servers: ciphertext_2
note right of Client: 解密流程
Servers->>Servers:SM4 Key||ciphertext_1 = SM2 Decrypt(SM2 Private Key, ciphertext_2)
Servers->>Servers: plaintext = SM4 Decrypt(SM4 Key, ciphertext_1)
Servers->>Servers: plaintext_2 = Handle( plaintext )
Servers->>Servers: ciphertext_3 = SM4 Encrypt(SM4 Key, plaintext_2)
Servers->>Client: Return ciphertext_3
Client->>Client: plaintext_2 = SM4 Decrypt(SM4 Key, ciphertext_3)
步驟
-
客戶端請求一個公鑰,存儲在JS代理里,服務(wù)器端保存私鑰;

gJ.apiUrl = cJ, gJ.interceptors.request.use((async e => ("post" === e.method && e.data && "json" === e.headers.contentType && (e.headers["Content-Type"] = "application/json;charset=UTF-8"), mJ.includes(e.url) && (pJ = btoa(uJ.sm4.encrypt(JSON.stringify(e.data), dJ)), fJ = btoa(uJ.sm2.doEncrypt(dJ, "049e2ed7ff95ecb3de4ca313dddf3956ead1386840ea752b4ccb227f4ffb361c37ed53eb30989bc88de0c56832fe8e251311f163518695221558cc114aff7cd0fa")), vJ = uJ.sm3(atob(pJ) + atob(fJ)), e.data = vJ + ":" + pJ + ":" + fJ),
-
每次客戶端生成一個隨機(jī)密鑰,作SM4對稱密鑰(DEK),
使用公鑰(CEK)作為 加密 對稱密鑰(DEK) = DEK的密文,
-
服務(wù)器使用私鑰,解密出明文DEK, DEK 可以解密 DEK加密的密文 得到登錄信息的明文。
浙公網(wǎng)安備 33010602011771號