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/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

发表回复

登录后才能评论