在企業系統中,前後端之間的 API 呼叫除了要確保資料完整性,更應考慮多層次的傳輸安全性。
許多人可能會問:
「我們已經使用 HTTPS 了,為什麼還需要額外的 API Payload 加密?」
確實,HTTPS(TLS)能保護傳輸通道的安全,但這層保護僅止於傳輸階段,以下是常見的潛在風險:
👉 簡而言之:HTTPS 是第一層防線,API Payload 加密則是第二層防護。
當 HTTPS 被繞過或節點遭入侵時,資料本身依舊能保持安全。
📦 範例程式:jsonrpc-sample
可透過 BeeSettingsEditor
工具的 Generate API Encryption Key 功能,產生一組新的 AES + HMAC 金鑰,並以 Master Key 加密後儲存在設定檔 (SecurityKeySettings.ApiEncryptionKey
) 中
📘 詳細操作說明:BeeSettingsEditor
JsonRpcServer
啟動時,會自動解密設定檔內的 API 加密金鑰,並寫入 BackendInfo.ApiEncryptionKey
,供後續 API 呼叫加密使用:
BackendInfo.ApiEncryptionKey =
EncryptionKeyProtector.DecryptEncryptedKey(masterKey, settings.ApiEncryptionKey);
Login
) 時,連同帳密一併傳送 RSA 公鑰至後端。FrontendInfo.ApiEncryptionKey
,後續 API 傳遞資料就可以 AES+HMAC 進行加密。此流程確保 API 加密金鑰僅存在於前後端記憶體中,不會以明碼傳輸。
簡化程式範例如下:
// 前端產生 RSA 金鑰並進行登入
RsaCryptor.GenerateRsaKeyPair(out var publicKeyXml, out var privateKeyXml);
//Login 一併傳送 RSA 公鑰
var loginArgs = new LoginArgs
{
UserId = "jeff",
Password = "1234",
ClientPublicKey = publicKeyXml
};
var result = await connector.ExecuteAsync<LoginResult>("Login", loginArgs, PayloadFormat.Encoded);
// 用 RSA 私鑰解密,取得 API 加密金鑰
FrontendInfo.ApiEncryptionKey = Convert.FromBase64String(
RsaCryptor.DecryptWithPrivateKey(result.ApiEncryptionKey, privateKeyXml));
下表為 ApiConnector
呼叫 API 的流程示意,當完成 Login
並取得 API 加密金鑰後,後續 API 呼叫即可進行加密:
API 方法 | 編碼 | 加密 | 說明 |
---|---|---|---|
Ping | ❌ | ❌ | 僅檢查服務存活,不帶機敏資料 |
GetCommonConfiguration | ❌ | ❌ | 取得系統共用參數,不含使用者資料 |
Login | ✔️ | ❌ | 登入並取得 API 加密金鑰 |
Hello | ✔️ | ✔️ | 登入後完整使用編碼與 AES + HMAC 加密 |
HTTPS = 通道加密:防止竊聽,但無法防止伺服器或節點遭入侵
API 加密 = 資料加密:即使通道失守,資料依舊安全無法竄改
此多層次防護架構,特別適合 ERP / HRM / CRM 等企業級系統,能有效降低單一防線失守帶來的資安風險。
💡 延伸說明:本文所採用的金鑰分發屬於 Key Wrapping,
若要實作動態 Session Key,則屬於 Key Exchange,安全性更高但實作複雜度也會提升。
📘 HackMD 原文筆記:
👉 https://hackmd.io/@jeff377/api-payload-encryption
📢 歡迎轉載,請註明出處
📬 歡迎追蹤我的技術筆記與實戰經驗分享
Facebook | HackMD | GitHub | NuGet