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朋友們,分享一些他們的技術見解和生活故事。