我們一起聊聊如何設計安全的對外API?

當向外部服務暴露API 時,確保安全通訊至關重要,以防止未經授權的存取和資料外洩。

兩種常用的API 安全方法是基於Token 的身份認證和基於HMAC(雜湊訊息認證碼)的認證。

以下我們來介紹這兩種方法的工作原理,並比較它們的差異。

01 基於令牌

  • 步驟1- 使用者在客戶端輸入密碼,客戶端將密碼傳送給驗證伺服器。
  • 步驟2- 驗證伺服器驗證憑證並產生一個有有效期限的令牌。
  • 步驟3和第4 步- 現在,客戶端可以發送請求,客戶端在每個API 請求的Authorization 頭中包含這個Token,存取伺服器資源。這種訪問在令牌過期前一直有效。

優點

  • 無狀態:伺服器不需要維護會話狀態,Token 本身包含驗證所需的所有資訊。
  • 靈活性:Token 可以包含角色或權限等元數據,支援細粒度的存取控制。
  • 支援OAuth 整合:與OAuth 2.0 相容,適合第三方整合場景。

缺點

  • Token 洩漏風險:如果Token 被攔截,攻擊者可以在Token 過期前濫用它,除非有其他機制(如Token 吊銷)在起作用。
  • Token 儲存:客戶端需要安全儲存Token,對於Web 或行動應用程式來說,這可能比較複雜。

02 基於HMAC

此機制使用雜湊函數(SHA256 或MD5)產生訊息驗證碼(簽章)。

  • 第1 和2 步- 伺服器產生兩個金鑰,一個是公共APP ID(公鑰),另一個是API 金鑰(私鑰)。
  • 步驟3:現在我們在客戶端產生一個HMAC 簽章(hmac A)。此簽名是根據圖中列出的一組屬性產生的。
  • 步驟4- 用戶端發送存取伺服器資源的請求,HTTP 頭包含hmac A。
  • 步驟5- 伺服器收到包含請求資料和驗證標頭的請求。它從請求中提取必要的屬性,並使用儲存在伺服器端的API 金鑰產生簽章(hmac B。)
  • 第6 和7 步- 伺服器會比較hmac A(在客戶端產生)和hmac B(在伺服器端產生)。如果兩者匹配,請求的資源將返回給客戶端。

優點

  • 防篡改:HMAC 確保請求在傳輸過程中未被竄改,即使只改變一個位元組,簽章也會不符。
  • 簡單:不需要Token 的發放或刷新,僅依賴共享金鑰和雜湊演算法。
  • 無Token 洩漏風險:因為沒有Token 可被盜取,這種方法天然安全。

缺點

  • 金鑰管理:客戶端和伺服器都必須安全地管理和儲存共用金鑰。一旦密鑰洩露,安全性就會受到影響。
  • 無狀態API 較複雜:HMAC 不提供內嵌元資料的無狀態認證,存取控制需要個別處理。

在HMAC 簽章中加入時間戳記是為了防止重播攻擊(replay attack)。重播攻擊是一種網路攻擊方式,攻擊者攔截合法的請求並在之後重複發送相同的請求,試圖偽造身分或重複操作。透過時間戳,伺服器可以驗證請求是否在合理的時間範圍內,從而大大提高系統的安全性。