一、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