<span class="hljs-keyword">if</span> (!Strings.isNullOrEmpty(token)) {
hasAuth = redisTemplate.hasKey(<span class="hljs-string">"userToken:"</span> + token);
}

這類方法實現比較簡單,可以做基本的身份認證,防君子不防小人,可通過中間人攻擊獲得 Authorization。使用 HTTPS 安全性會得到提高,但是無法抵御重放攻擊造成的影響,例如 DDOS,我們這里來分析一下會遭受什么攻擊?怎么實現攻擊手法

中間人攻擊(MITM)

在非加密的HTTP連接上,任何在網絡路徑上的攻擊者都可以截取和讀取請求和響應的內容。這意味著如果Authorization頭包含的是純文本的用戶名/密碼組合或者是一個靜態令牌,攻擊者可以輕松地獲取這些信息,并在后續的請求中重用它們來冒充合法用戶。

重放攻擊(Replay Attack)

即使使用HTTPS來加密通信,靜態的認證令牌仍然容易受到重放攻擊。在這種攻擊中,攻擊者不是截取和解密數據,而是簡單地記錄下一次成功的認證請求,然后重復發送這個請求來訪問資源。這是因為靜態令牌在一段時間內保持不變,所以攻擊者可以多次使用同一個令牌

API簽名認證流程

Part 1: 請求端加密

請求端加密是說,比如我對你說話,那么我是請求端,是我這里說話的時候進行加密,把我說的話加密一下再說給你,而你是服務端

  1. 秘鑰分發:服務器向API使用者提供一對密鑰,即AK(Access Key)和SK(Secret Key)。AK是公開的,而SK需要保密,因為它是用于生成簽名的密鑰。
  2. 簽名規則
  3. 請求構造:將X-Ca-Key(即AK)和X-Ca-Signature(即簽名)添加到HTTP請求頭中,一同發送至服務器。

看一下下面的圖

Part 2: 服務器端驗證

剛才我說道服務端是你,請求端是我,還用這個舉例子,我把話說給你之后然后你是服務端,我加密了,說給你的話是加密的,這時候你需要驗證并解密我說的話才行,那么是服務端解密和驗證

  1. 驗證AK:服務器收到請求后,首先檢查請求頭中的AK,確認請求者身份。
  2. 重新計算簽名:服務器使用相同的算法和SK重新計算簽名,以驗證請求的完整性和一致性。
  3. 比較簽名:將計算出的簽名與請求頭中的簽名進行對比。如果匹配,則認為請求有效;如果不匹配,則拒絕請求,因為可能存在數據篡改或非授權訪問。

防御重放攻擊

主要防的是你burpsuite抓包重放,有了這個驗證你想著通過bp抓包重放進行攻擊,抱歉不可能了,因為會驗證和加密,你抓包后在放包的時候會出現驗證不過,會丟棄你那個包,到最后實現防御你這個攻擊。API簽名機制可以通過加入時間戳和nonce(一次性隨機數)來進一步增強安全性,以防御重放攻擊。時間戳和nonce都會被包含在簽名計算中,且每個請求的時間戳和nonce都應該唯一。服務器會檢查時間戳,確保請求沒有過期,并且會跟蹤nonce,以避免處理重復的請求。

為了提高安全性,通常會結合使用timestamp(時間戳)和nonce(一次性隨機數),以防止重放攻擊(replay attack)。下面我進行全面的講解

Timestamp 和 Nonce 的作用

使用Timestamp和Nonce的挑戰

API簽名與HTTPS的關系

我們講到這里會有人詢問,這個API簽名加密和https是不是一回事?直接用https加密不行了還搞那么麻煩那么多事情干嘛?抱歉,這里我要說的是,不是一個概念,甚至這兩個東西不是同樣的東西,https是傳輸層的一個加密,和API簽名不在同一層,我來進行一下解析。

結合HTTPS和API簽名,可以提供更全面的安全保障,既保護了數據在傳輸過程中的安全,也確保了到達服務器的請求是合法且未被篡改的。在實際部署中,這是推薦的做法,尤其對于涉及敏感數據和交易的API。

作者:幻城

上一篇:

Windows10+vs 2017中創建WEB API教程

下一篇:

關于API令牌你需要知道的一切
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費