JWT生成:從基礎到實戰

一、JWT生成token

JWT(JSON Web Token)是一個開放的標準,定義了用於在各方之間安全地傳輸聲明的方式。在這個標準中,JWT用於在用戶和身份驗證之間傳遞信息,並且可以使用密鑰對其簽名,以便確保已傳遞的信息不會被篡改。JWT由頭部、載荷和簽名組成,用於生成token。

<?php
// 頭部
$header = array(
    'alg' => 'HS256', // 簽名演算法
    'typ' => 'JWT'
);
$header = json_encode($header);
$header = base64_encode($header);
// 載荷
$payload = array(
    'sub' => '1234567890', // 主題
    'name' => 'John Doe', // 姓名
    'iat' => 1516239022 // 簽發時間
);
$payload = json_encode($payload);
$payload = base64_encode($payload);
// 簽名
$signature = hash_hmac('SHA256', "$header.$payload", 'mysecret', true);
$signature = base64_encode($signature);
// JWT token
$token = "$header.$payload.$signature";
?>

二、JWT生成流程

JWT生成流程主要包括三個步驟:頭部、載荷和簽名。

頭部包含兩個欄位:alg表示簽名演算法,typ表示令牌類型,這兩個欄位會以JSON結構進行編碼,然後通過base64Url編碼。

載荷包含要傳遞的信息,比如用戶ID、角色、許可權等,和一些元數據,比如過期時間、簽發時間等。與頭部一樣,載荷也要以JSON結構進行編碼,然後通過base64Url編碼。

簽名是用於驗證token是否被篡改的關鍵步驟。簽名需要使用頭部、載荷以及密鑰。簽名演算法可以是HS256、HS384或HS512等。首先需要使用指定的演算法生成一個簽名,然後也需要通過base64Url編碼。最後,將編碼後的頭部、載荷和簽名用點號連接起來,形成完整的JWT。

三、JWT生成規則

生成JWT token的各個部分需要遵循一定的規則。

頭部和載荷都要用JSON編碼,然後通過base64Url編碼。注意,base64Url編碼需要去掉=符號、將+替換為-、將/替換為_。

簽名需要使用指定的演算法,並且需要使用到密鑰。密鑰需要妥善保管,不要泄露。在生成簽名的過程中,需要使用頭部和載荷的JSON編碼結果、密鑰以及指定的演算法。簽名的結果同樣需要進行base64Url編碼。

四、JWT生成token原理

生成JWT token的原理就是利用JSON Web Signature(JWS)規範實現的。JWS使用到兩個相互獨立的加密演算法,一個用於生成簽名,一個用於對消息進行加密,以確保其完整性和機密性。在生成JWS中的簽名時,需要使用到Hash-based Message Authentication Code(HMAC),這種機制既可以作為簽名演算法,也可以在一些加密演算法之上進行使用。

在生成JWT token時,可以使用不同的密鑰對頭部、載荷、簽名進行簽名。因此,密鑰的管理是保證JWT token安全的關鍵。同時,在使用JWT token時,需要進行驗證簽名,否則JWT token可能會被篡改。

五、JWT生成的token格式

JWT生成的token格式包含三個部分:頭部、載荷和簽名,它們之間以點號(.)分隔開來。

eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9.eyJzdWIiOiAiMTIzNDU2Nzg5MCIsICJuYW1lIjogIkpvaG4gRG9lIiwgImlhdCI6IDE1MTYyMzkwMjJ9.5upIKvc5ClYFkTYW7qJBE0LjYOcJLhUkLCRbRgB0jHU

頭部和載荷都是基於JSON進行編碼,並使用base64Url編碼進行處理。簽名則是對頭部、載荷和密鑰進行簽名,生成的結果也是使用base64Url編碼進行處理。

六、JWT生成token的演算法

JWT生成token的演算法有多種,包括HS256、HS384、HS512等。這些演算法都是基於HMAC的,其中HS代表HMAC with SHA。

以HS256演算法為例,它在計算簽名時會使用到頭部和載荷的base64Url編碼形式,以及一個密鑰。在計算簽名時,需要首先將頭部和載荷使用點號(.)連接起來,然後通過指定的演算法(HMAC-SHA256)生成簽名。生成的簽名並不是使用base64Url編碼的字元串,而是一段原始的二進位數據,需要再次進行base64Url編碼。最後,將base64Url編碼後的頭部、載荷和簽名用點號(.)連接起來,就生成了一個JWT token。

<?php
function generateJWTToken($payload, $secret) {
    $header = base64_encode(json_encode(array(
        "alg" => "HS256",
        "typ" => "JWT"
    )));
    $payload = base64_encode(json_encode($payload));
    $signature = base64UrlEncode(hash_hmac("SHA256", "$header.$payload", $secret, true));
    return "$header.$payload.$signature"; 
}

function verifyJWTToken($token, $secret) {
    list($header, $payload, $signature) = explode(".", $token);
    $signature2 = base64UrlEncode(hash_hmac("SHA256", "$header.$payload", $secret, true));
    return $signature == $signature2;
}

function base64UrlEncode($input) {
    return str_replace("=", "", strtr(base64_encode($input), "+/", "-_"));
}
?>

七、JWT生成token退出登錄

通常,JWT token的有效期比較短,如果需要退出登錄,只需要讓客戶端刪除該token即可。由於JWT token不需要在伺服器端保存狀態,因此退出登錄的過程也比較簡單。

八、JWT生成token有效期選取

JWT token的有效期需要根據具體的業務需求進行選擇。有效期過短可能會對用戶的體驗產生不良影響,過長則可能會存在安全隱患。

一般來說,JWT token的有效期可以設置為幾十分鐘到幾小時,具體取決於用戶的操作習慣。在設置有效期時,同時應該考慮到token的生成和驗證的開銷,以避免對伺服器性能的影響。

總結

JWT是一種用於在各方之間安全傳輸信息的標準,可以用於實現身份驗證、資源訪問控制等功能。生成JWT token需要遵循一定的規則,包括JSON編碼、base64Url編碼、簽名等。在生成和使用JWT token時,需要注意密鑰的保密和簽名的驗證。同時,在設置JWT token的有效期時,需要考慮到用戶體驗和伺服器性能的因素。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/152791.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-13 06:06
下一篇 2024-11-13 06:06

相關推薦

  • Python基礎代碼用法介紹

    本文將從多個方面對Python基礎代碼進行解析和詳細闡述,力求讓讀者深刻理解Python基礎代碼。通過本文的學習,相信大家對Python的學習和應用會更加輕鬆和高效。 一、變數和數…

    編程 2025-04-29
  • 數據結構與演算法基礎青島大學PPT解析

    本文將從多個方面對數據結構與演算法基礎青島大學PPT進行詳細的闡述,包括數據類型、集合類型、排序演算法、字元串匹配和動態規劃等內容。通過對這些內容的解析,讀者可以更好地了解數據結構與算…

    編程 2025-04-29
  • Python零基礎PDF下載

    本文將為大家介紹如何使用Python下載PDF文件,適合初學者上手實踐。 一、安裝必要的庫 在Python中,我們需要使用urllib和requests庫來獲取PDF文件的鏈接,並…

    編程 2025-04-29
  • 樹莓派DIY無人機一:製作基礎

    本文將介紹如何使用樹莓派製作一個可飛行的小型無人機。本文將介紹樹莓派的選型、比例積木的使用、無線電通信以及如何控制飛行器的基本運動。 一、樹莓派的選型 在DIY無人機中,樹莓派是必…

    編程 2025-04-29
  • Polyphone音頻編輯器基礎入門教程

    Polyphone是一款免費的音頻編輯器,可用於編輯.sf2和.sfz格式的音色庫。本文將詳細介紹Polyphone的基礎操作及使用方法。 一、安裝和簡介 首先,我們需要下載並安裝…

    編程 2025-04-29
  • JWT驗證Token的實現

    本文將從以下幾個方面對JWT驗證Token進行詳細的闡述,包括:JWT概述、JWT驗證Token的意義、JWT驗證Token的過程、JWT驗證Token的代碼實現、JWT驗證Tok…

    編程 2025-04-29
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python基礎語言

    Python作為一種高級編程語言擁有簡潔優雅的語法。在本文中,我們將從多個方面探究Python基礎語言的特點以及使用技巧。 一、數據類型 Python基礎數據類型包括整數、浮點數、…

    編程 2025-04-28
  • Django框架:從簡介到項目實戰

    本文將從Django的介紹,以及如何搭建Django環境開始,逐步深入到Django模型、視圖、模板、表單,最後通過一個小型項目實戰,進行綜合性的應用,讓讀者獲得更深入的學習。 一…

    編程 2025-04-28
  • 鍵值存儲(kvs):從基礎概念到實戰應用

    本文將從基礎概念入手,介紹鍵值存儲(kvs)的概念、原理以及實戰應用,並給出代碼實現。通過閱讀本文,您將了解鍵值存儲的優缺點,如何選擇最適合的鍵值存儲方案,以及如何使用鍵值存儲解決…

    編程 2025-04-28

發表回復

登錄後才能評論