當前位置:成語大全網 - 書法字典 - 防CSRF攻擊的令牌生成和驗證原理

防CSRF攻擊的令牌生成和驗證原理

令牌由消息、分隔符和簽名組成。

Msg由客戶端標識信息(uid、did)、隨機字符體和到期時間戳組成。

用符號(如“$”和“)將msg部分與加密簽名部分分開。

簽名簽名是根據上述消息中提到的消息的信息部分並根據特定的密鑰對上述消息進行加密。

令牌= base64(msg)格式...base64(sha 256(“key“,msg))

當用戶從客戶端獲得令牌並再次提交給服務器時,服務器首先判斷令牌的有效性,如果有效,則處理請求。

服務器將客戶端發送的令牌解構為三個部分:消息、分隔符和簽名。

服務器首先驗證令牌是否仍然具有時間敏感性,如果不具有時間敏感性,它將拒絕訪問。

服務器對客戶端發送的信息進行簽名,如果獲得的簽名與客戶端發送的簽名相同,則令牌有效。

JWT由以下三部分組成:

即:

頭部分是壹個描述JWT元數據的JSON對象,通常如下所示。

alg屬性表示簽名算法,默認值是HMAC SHA256(寫為HS256)。

Typ屬性表示該令牌的類型,JWT令牌寫為JWT。

Payload部分也是壹個JSON對象,用於存儲實際需要傳遞的數據。JWT指定了七個官方字段供選擇。

除了官方字段之外,您還可以在此部分定義私有字段。這裏有壹個例子:

請註意,JWT在默認情況下是未加密的,任何人都可以讀取它,因此不要在此部分放置機密信息。

這個JSON對象也將使用Base64URL算法轉換為字符串。

簽名部分是前兩部分的簽名,以防止數據篡改。

首先,您需要指定壹個秘密。這個密鑰只有服務器知道,不能向用戶公開。然後,使用報頭中指定的簽名算法(默認為HMAC SHA256),根據以下公式生成簽名:

在計算簽名後,報頭、有效載荷和簽名被組合成壹個字符串,每個部分由壹個“點”分隔(。),可以返還給用戶。

如前所述,字符串頭和有效負載的算法是Base64URL。該算法與Base64算法基本相似,但有壹些細微的區別。

在某些場合(如api.example.com/?)URL中可能會放入JWT作為令牌。Base64有三個字符+、/和=,它們在URL中有特殊含義,因此應該替換為:=省略、+替換為-、/替換為_。這是Base64URL算法。

客戶端接收服務器返回的JWT,它可以存儲在Cookie或localStorage中。

從那以後,每次客戶端與服務器通信時,它都必須帶來這個JWT。您可以將其放在Cookie中並自動發送,但它不能跨域發送,因此最好將其放在HTTP請求的標頭信息授權字段中。

授權:不記名& lt令牌& gt

另壹種方法是當跨域時,JWT被放在POST請求的數據體中。