API接口安全設計方案(已實現)


1、背景

網絡安全方案,主要從數據加密與api接口安全兩個方面考慮,數據加密https已經加密了,就不再次加密了;主要從api安全方面考慮。

2、接口安全設計

在代碼層面,對接口進行安全設計
一、使用token進行用戶身份認證
二、使用sign防止傳入參數被篡改
三、用時間戳防止暴力請求

一、使用token進行用戶身份認證

用戶身份認證的流程圖如下:

具體說明如下:

1、 用戶登錄時,客戶端請求接口,傳入用戶名和密文的密碼
2、 后台服務對用戶身份進行驗證。若驗證失敗,則返回錯誤結果;若驗證通過,則生成一個隨機不重復的token,並將其存儲在redis中,設置一個過期時間。
  其中,redis的key為token,value為驗證通過后獲得的用戶信息
3、 用戶身份校驗通過后,后台服務將生成的token返回客戶端。
  客戶端請求后續其他接口時,需要帶上這個token。后台服務會統一攔截接口請求,進行token有效性校驗,並從中獲取用戶信息,供后續業務邏輯使用

二、使用sign防止傳入參數被篡改

為了防止中間人攻擊(客戶端發來的請求被第三方攔截篡改),引入參數的簽名機制。
  具體步驟如下:

1、客戶端和服務端約定一個加密算法(或MD5摘要也可), 客戶端發起請求時,將所有的非空參數按升序拼在一起,通過加密算法形成一個sign,將其放在請求頭中傳遞給后端服務。
2、后端服務統一攔截接口請求,用接收到的非可空參數根據約定好的規則進行加密,和傳入的sign值進行比較。若一致則予以放行,不一致則拒絕請求。

由於中間人不知道加密方法,也就不能偽造一個有效的sign。從而防止了中間人對請求參數的篡改。

三、用時間戳防止暴力請求

sign機制可以防止參數被篡改,但無法防dos攻擊(第三方使用正確的參數,不停請求服務器,使之無法正常提供服務)。因此,還需要引入時間戳機制。
  具體的操作為:客戶端在形成sign值時,除了使用所有參數和token外,再加一個發起請求時的時間戳。即

sign值來源 = 所有非空參數升序排序+token+timestamp

而后端則需要根據當前時間和sign值的時間戳進行比較,差值超過一段時間則不予放行。
  若要求不高,則客戶端和服務端可以僅僅使用精確到秒或分鍾的時間戳,據此形成sign值來校驗有效性。這樣可以使一秒或一分鍾內的請求是有效的。
  若要求較高,則還需要約定一個解密算法,使后端服務可以從sign值中解析出發起請求的時間戳。
  總結后的流程圖如下:

3、項目擬采用的方案

(1)獲取token

這里還是隱藏下了。

(2)接口新增三個字段:token、timestamp、sign

{ 
  "address": "33",
  "bussinessType": "22",
  "city": "111",
  "companyName": "st232ring",
  "token": "idfajdjjlkczkvhcklgjkfsj<jjkv",
  "timestamp": "20210714164139",
  "sign":"fdakfljdkfjdks"
}

(3)簽名sign生成規則

規則:sha1(keyvalkeyval+token+timestamp+id)

例如:sha1(address33bussinessType22city111companyNamest232ringtokentimestampid)

這里新增一個id值,與token對應,傳輸過程中不使用,只用於加密,保證數據即使被截獲,因為請求中沒有id的傳輸,更加安全。

(4)幾個參數上面已經說過了,簡單再說一句。

token身份認證;

timestamp方式防止dos攻擊,防止重放,簡單說就是一次接口調用,只能用一定時間,比如比對時間,60s內該次調用有效,60秒后失效;

sign簽名,通過參數+token+timestamp+id固定位加密,保證參數不會被修改,調用有效;


更多信息請關注公眾號:「軟件老王」,關注不迷路,軟件老王和他的IT朋友們,分享一些他們的技術見解和生活故事。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM