PHP Token生成和验证

一、Token概述

Token是指由服务器生成的、含有一定意义且不可伪造的加密字串,用于在用户和服务器之间进行身份验证或者数据传输,相对于Cookie和Session更加安全、灵活、可扩展。

一般情况下,Token是以JSON Web Token(JWT)的形式出现,由三部分组成:Header(头部)、Payload(载荷)和Signature(签名)。Header和Payload均为Base64编码的JSON字符串,Header定义了所使用的加密算法和加密类型,Payload包含了自定义的信息,这些信息是被加密后共享给接收方的;Signature是由Header和Payload的编码串拼接而成的字符串经过指定算法加密后生成的。

二、生成Token

在PHP中生成Token需要用到两个函数,分别是base64_encode()和hash_hmac()。具体步骤如下:

1、生成Header

$header = [
    'alg' => 'HS256',  // 使用HMAC-SHA256算法,常用的还有HMAC-SHA512
    'typ' => 'JWT'
];
$header = json_encode($header);
$header = base64_encode($header);

2、生成Payload

$payload = [
    'iss' => 'example.com',  // 签名者
    'sub' => '1234567890',  // 签名对象
    'aud' => 'client_id',  // 接收方
    'iat' => time(),  // 签名时间
    'exp' => time() + 3600  // 签名过期时间
];
$payload = json_encode($payload);
$payload = base64_encode($payload);

3、生成Signature

$signature = hash_hmac('sha256', $header . '.' . $payload, 'secret_key', true);
$signature = base64_encode($signature);

4、生成Token

$token = $header . '.' . $payload . '.' . $signature;

三、验证Token

验证Token时需要用到的函数是base64_decode()和json_decode()。具体步骤如下:

1、将Token按”.”分割

$tokenArr = explode('.', $token);
$header = $tokenArr[0];
$payload = $tokenArr[1];
$signature = $tokenArr[2];

2、计算Server Signature

$serverSignature = hash_hmac('sha256', $header . '.' . $payload, 'secret_key', true);
$serverSignature = base64_encode($serverSignature);

3、检查Signature是否相同

$isSignatureValid = hash_equals($signature, $serverSignature);  // 比较时需要使用hash_equals()函数防止时序攻击

4、解码Payload并验证过期时间

$payload = base64_decode($payload);
$payload = json_decode($payload);
$isExpired = time() > $payload->exp;  // 检查是否已经过期

四、使用Token

使用Token需要在HTTP头部中加入Authorization字段,并将Token值作为Bearer参数传递。具体代码实现如下:

$token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
$headers = array('Authorization: Bearer ' . $token);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_exec($curl);
curl_close($curl);

五、安全注意事项

在生成和验证Token时需要注意以下几点:

1、密钥绝不能明文保存在代码中,应该通过环境变量或其他安全方式存储;

2、一旦Token被泄露,任何人都可以模仿对应的身份访问服务器,因此要设置有效期和刷新机制;

3、在验证Signature时要用hash_equals()函数代替简单的字符串比较,以防止时序攻击;

4、为了防止重放攻击,可以在Payload中添加诸如nonce、jti等标识符来保证Token的唯一性。

原创文章,作者:VDHEK,如若转载,请注明出处:https://www.506064.com/n/362684.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
VDHEKVDHEK
上一篇 2025-02-27 19:28
下一篇 2025-02-27 19:31

相关推荐

  • PHP和Python哪个好找工作?

    PHP和Python都是非常流行的编程语言,它们被广泛应用于不同领域的开发中。但是,在考虑择业方向的时候,很多人都会有一个问题:PHP和Python哪个好找工作?这篇文章将从多个方…

    编程 2025-04-29
  • PHP怎么接币

    想要在自己的网站或应用中接受比特币等加密货币的支付,就需要对该加密货币拥有一定的了解,并使用对应的API进行开发。本文将从多个方面详细阐述如何使用PHP接受加密货币的支付。 一、环…

    编程 2025-04-29
  • JWT验证Token的实现

    本文将从以下几个方面对JWT验证Token进行详细的阐述,包括:JWT概述、JWT验证Token的意义、JWT验证Token的过程、JWT验证Token的代码实现、JWT验证Tok…

    编程 2025-04-29
  • 使用PHP foreach遍历有相同属性的值

    本篇文章将介绍如何使用PHP foreach遍历具有相同属性的值,并给出相应的代码示例。 一、基础概念 在讲解如何使用PHP foreach遍历有相同属性的值之前,我们需要先了解几…

    编程 2025-04-28
  • PHP获取301跳转后的地址

    本文将为大家介绍如何使用PHP获取301跳转后的地址。301重定向是什么呢?当我们访问一个网页A,但是它已经被迁移到了另一个地址B,此时若服务器端做了301重定向,那么你的浏览器在…

    编程 2025-04-27
  • 如何通过knife4j设置全局token

    本文将介绍如何在使用knife4j作为接口文档管理工具时,通过设置全局token来提高接口文档的安全性。 一、什么是knife4j Knife4j是一款基于springfox的开源…

    编程 2025-04-27
  • PHP登录页面代码实现

    本文将从多个方面详细阐述如何使用PHP编写一个简单的登录页面。 1. PHP登录页面基本架构 在PHP登录页面中,需要包含HTML表单,用户在表单中输入账号密码等信息,提交表单后服…

    编程 2025-04-27
  • PHP与Python的比较

    本文将会对PHP与Python进行比较和对比分析,包括语法特性、优缺点等方面。帮助读者更好地理解和使用这两种语言。 一、语法特性 PHP语法特性: <?php // 简单的P…

    编程 2025-04-27
  • PHP版本管理工具phpenv详解

    在PHP项目开发过程中,我们可能需要用到不同版本的PHP环境来试验不同的功能或避免不同版本的兼容性问题。或者我们需要在同一台服务器上同时运行多个不同版本的PHP语言。但是每次手动安…

    编程 2025-04-24
  • PHP数组去重详解

    一、array_unique函数 array_unique是php中常用的数组去重函数,它基于值来判断元素是否重复,具体使用方法如下: $array = array(‘a’, ‘b…

    编程 2025-04-24

发表回复

登录后才能评论