webapi token 引數簽名是如何生成的

2021-08-02 02:52:10 字數 3274 閱讀 5395

在剛接觸介面開發時,可能腦子裡壓根就沒有這個介面呼叫安全性的原則,但常識性的經驗告訴我們,每乙個請求都應該有原則地保障安全性。

例如這個介面   這個獲取使用者列表資訊的請求總不能在位址列一輸入就直接顯示資訊(雖然有點誇張,不至於阿貓阿狗的資訊這麼容易get吧),在寫webapi介面原則性的基本要求必須得保證資料的安全性和請求的有效性

在這裡我就使用token+引數簽名+時間戳  這三個系統引數來**請求的有效性(即時100%請求有效,也不能說100%也安全了)。

引數名必選

型別作用

token

是string

呼叫方標識,保障其身份是來自本系統認證過的,有效識別使用者身份

sign

否   

string

介面引數的key,value的記錄,防止引數值被篡改,防止偽裝請求

timestamp

f否int

時間戳,防止重放攻擊

那麼問題來

1.token 如何生成?作用是什麼?

2.引數簽名如何生成?作用是什麼?

3.時間戳的作用是什麼?

看了這篇文章你就知道了。這三個系統引數是如何保證請求的有效性,一定程度上提高資料的安全性

token生成:一般的api基本上主要分為兩種客戶端訪問api的token和需要使用者登入之後的token,這裡我就來說一下後者,(簡單通俗做法)使用者登入輸入使用者名稱、密碼,訪問api,驗證資料庫成功。這個時候可以產生token,失敗直接返回。問題又來了!

1.token生成的方式是什麼?2.token存在**?3.token如何驗證是否正確

在驗證資料成功之後可以獲取唯一使用者標識(使用者名稱也行),就以username:zhanglin為例吧,對這個標識進行加密(des,md5、其他的也行,關鍵資料必須得加密),這個加密之後的字串就可以做為乙個token了。

2.token每次請求都需要進行傳遞,推薦存在cookie,也可以持久化到客戶端。現在有這樣乙個api介面

這個encryptzhanglinstr就是登入成功後加密的username返回的給客戶端,客戶端用什麼儲存這裡就不多介紹了,只需要知道返回給客戶端乙個使用者訪問的token類即可,到了伺服器端方法驗證的時候再進行解密,獲取到字串zhanglin,然後將這個zhanglin與系統使用者(可採用快取資料庫、快取token的值)對比,如果對比存在,則說明有許可權去訪問api,反之非法的請求。

還是**來實現一下吧。**比較容易理解,就是為了把這個原理說清楚一點

[route("login")]

public bool login(string account, string pwd)

else

}

token的產生就是登陸之後根據使用者標識儲存在cookie裡,這樣在客戶端每次傳送請求的時候都會帶上token這個引數,如下:

}3.這樣就可以驗證token是否正確,一般都是用快取。

token的作用的就是判斷請求是否是系統使用者發出的,這樣能有效識別請求使用者的身份資訊

2..引數簽名如何生成?作用是什麼?

引數簽名sign:為了提高傳參過程中,防止引數被惡意修改,在請求介面的時候加上sign可以有效防止引數被篡改,那麼sign是如何起作用的呢?

看看它的生成方法就明白了

比如有這樣乙個介面http:127.0.0.1/api/product?&type=zl&p1=value1&p2=value2&p3=&sign=signvalue

第一步:拼接引數字串,除去sign引數本身和為空值的p3,那麼剩下的就是字串type=zl&p1=value1&p2=value2,然後按引數名字元公升(降)序,得到字串

p1=value1&p2=value2&type=zl

第二步:然後做引數名和值的拼接,得到字串p1value1p2value2type=zl,注意編碼,不能出現這種" ,要轉碼後「後拼接

第三步:將字串進行des加密,假設p1value1p2value2type=zl進行des加密後的結果是abc123,最終得到的字串abc123就是引數sign的值signvalue

第四步:在介面中我們會接收到引數名sign的引數值abc123,然後解密得到字串p1value1p2value2type=zl,再與介面中引數拼接排序後進行比較,如果不一樣則說明引數的循序不一樣,引數的值就一定是被修改過了。

總結:1.介面的呼叫方和介面的提供方統一約定引數加密演算法

2.引數簽名就是對引數key ,value的乙個記錄。引數如果被修改肯定對不上引數簽名,就不會呼叫請求

3.時間戳的作用?

在api請求的介面,客戶端請求的發生時間便是時間戳,這個引數到了伺服器,與伺服器端時間對比,如果時間間隔較長則無效。

在asp.net mvc的開發webapi介面時,可以使用mvc的過濾器進行以上三個關鍵引數的攔截過濾。以下**是在.net core中實現的,方法還是一樣的,都是在進入方法前進行攔截,這是乙個登入的api。

返回api結果是乙個類apiresult.cs,序列化成json物件,該類包含兩個泛型方法請求成功的ok方法,請求失敗的error方法

public class myfilterattribute : microsoft.aspnetcore.mvc.filters.actionfilterattribute

catch (exception ex)

//var accountname = context.routedata.values["accountname"].tostring()

var expires_minute = (timespan - datetime.now.ticks) / 60000000000;

if (expires_minute> 10||expires_minute

var ok = ("account" + account + "password" + password).contains(signature);//todo 加密解密

PHP API介面簽名驗證,引數簽名邏輯實現

1 原始資料 array name xubin age 17 男 2 新增反斜槓 array name xubin age 17 男 3 排序 array age 17 name xubin 男 4 拼接成字串 age 17namexubin 男 5 拼接簽名key age 17namexubin ...

spring 獲取方法引數簽名

最近在用cxf restful cxf3 整合了validation,但hibernate validation返回的異常資訊裡不能準確的顯示出方法引數簽名,只能以arg0 arg1來表示引數,對於我們的外部api來說我只能說hibernate做的真爛,spring 在處理這方面就做的很好,最後還是...

關於引數簽名的總結

引數簽名 這是我們今天討論的重點 引數簽名可以保證開發的者的資訊被冒用後,資訊不會被洩露和受損。原因在於接入者和提供者都會對每一次的介面訪問進行簽名和驗證。下面我們就簡述下這個過程。可以這樣理解接入者把需求訪問的介面的所有必要的引數資訊 一般都會有乙個accesskey id,用於標示接入者的資訊,...