
關于API令牌你需要知道的一切
<span class="hljs-keyword">if</span> (!Strings.isNullOrEmpty(token)) {
hasAuth = redisTemplate.hasKey(<span class="hljs-string">"userToken:"</span> + token);
}
這類方法實現比較簡單,可以做基本的身份認證,防君子不防小人,可通過中間人攻擊獲得 Authorization。使用 HTTPS 安全性會得到提高,但是無法抵御重放攻擊造成的影響,例如 DDOS,我們這里來分析一下會遭受什么攻擊?怎么實現攻擊手法
在非加密的HTTP連接上,任何在網絡路徑上的攻擊者都可以截取和讀取請求和響應的內容。這意味著如果Authorization
頭包含的是純文本的用戶名/密碼組合或者是一個靜態令牌,攻擊者可以輕松地獲取這些信息,并在后續的請求中重用它們來冒充合法用戶。
即使使用HTTPS來加密通信,靜態的認證令牌仍然容易受到重放攻擊。在這種攻擊中,攻擊者不是截取和解密數據,而是簡單地記錄下一次成功的認證請求,然后重復發送這個請求來訪問資源。這是因為靜態令牌在一段時間內保持不變,所以攻擊者可以多次使用同一個令牌
請求端加密是說,比如我對你說話,那么我是請求端,是我這里說話的時候進行加密,把我說的話加密一下再說給你,而你是服務端
看一下下面的圖
剛才我說道服務端是你,請求端是我,還用這個舉例子,我把話說給你之后然后你是服務端,我加密了,說給你的話是加密的,這時候你需要驗證并解密我說的話才行,那么是服務端解密和驗證
主要防的是你burpsuite抓包重放,有了這個驗證你想著通過bp抓包重放進行攻擊,抱歉不可能了,因為會驗證和加密,你抓包后在放包的時候會出現驗證不過,會丟棄你那個包,到最后實現防御你這個攻擊。API簽名機制可以通過加入時間戳和nonce(一次性隨機數)來進一步增強安全性,以防御重放攻擊。時間戳和nonce都會被包含在簽名計算中,且每個請求的時間戳和nonce都應該唯一。服務器會檢查時間戳,確保請求沒有過期,并且會跟蹤nonce,以避免處理重復的請求。
為了提高安全性,通常會結合使用timestamp(時間戳)和nonce(一次性隨機數),以防止重放攻擊(replay attack)。下面我進行全面的講解
我們講到這里會有人詢問,這個API簽名加密和https是不是一回事?直接用https加密不行了還搞那么麻煩那么多事情干嘛?抱歉,這里我要說的是,不是一個概念,甚至這兩個東西不是同樣的東西,https是傳輸層的一個加密,和API簽名不在同一層,我來進行一下解析。
結合HTTPS和API簽名,可以提供更全面的安全保障,既保護了數據在傳輸過程中的安全,也確保了到達服務器的請求是合法且未被篡改的。在實際部署中,這是推薦的做法,尤其對于涉及敏感數據和交易的API。
作者:幻城