为了账号安全,请及时绑定邮箱和手机立即绑定

PHP 中的自定义 JWT 一直说签名无效

PHP 中的自定义 JWT 一直说签名无效

PHP
侃侃无极 2022-01-24 10:57:34
我是新手,我正在尽力创建自己的 JWT 类。我认为我做的一切都是正确的,但是当我尝试将我的令牌粘贴到 jwt.io 中时,它一直说签名无效。我不禁觉得我要么错过了一些愚蠢的东西,要么有什么不对劲。我的代码如下:class Jwt{protected $header;protected $payload;protected $signature;protected $secret;protected $alg;protected $jwt;function __construct($header, $payload, $secret){$this->SetHeader($header);$this->alg = $header['alg'];$this->SetPayload($payload);$this->secret = $secret;$this->SetSignature();}public function SetHeader($header){$this->header = str_replace(["+", "/", "="],['-', '_',""],base64_encode(json_encode($header)));   }public function SetPayload($payload){$this->payload = str_replace(["+", "/", "="],['-',   '_',""],base64_encode(json_encode($payload)));  }public function SetSignature(){$data = $this->header.".".$this->payload;$this->alg = str_replace('HS', 'sha', $this->alg);$hashedData = hash_hmac($this->alg, $data , $this->secret, true);$this->signature = str_replace(["+", "/", "="], ['-', '_', ""],   base64_encode($hashedData));}public function SetJwt(){$this->jwt = $this->header.'.'.$this->payload.'.'.$this->signature;}public function GetJwt(){return $this->jwt;}在我的 Index.php 中:use root\lib\Jwt;$myFavorites = ['element' => 'Sun', 'animal' => 'Leopard','color'=>'Orange'];$secret = bin2hex(random_bytes(32));$jwt = new Jwt(['alg' => 'HS256', 'typ' => 'JWT'], $myFavorites, $secret)$jwt->SetJwt();var_dump($jwt->GetJwt());一切正常,调试器显示正确的输出,但不知何故它只是说无效的签名。如果我在 jwt.io 网站上更改算法,它就可以工作。所以我猜它与签名或算法有关我正在从 var_dump 的屏幕输出中复制它,这可能是原因吗?新令牌是:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbGVtZW50IjoiU3VuIiwiYW5pbWFsIjoiTGVvcGFyZCIsImNvbG91ciI6Im9yYW5nZSJ9.LF-4HNxgzhqYaIQKTImwO8A8SHIZfVYz2iGtQm7A我什至尝试更改标头 HS256 或 HS384 中的算法,然后对函数内部的更改进行硬编码,没有区别任何意见,将不胜感激
查看完整描述

1 回答

?
Helenr

TA贡献1780条经验 获得超3个赞

在您的代码中,您使用的是 HMAC 散列,它采用算法参数sha256sha384. 这些算法名称与可在 JWT 中使用的算法名称不同。

RFC 7517 第 4.1.1 节 中,您可以阅读有关alg标头的信息:

可以在 [JWA] 建立的 IANA“JSON Web 签名和加密算法”注册表中找到为此用途定义的“alg”值列表;此注册表的初始内容是 [JWA] 第 3.1 节中定义的值。

根据HMAC ShaXXX 算法的RFC7518 第 3.1 节HSXXX,你有你使用,例如HS256HS384

JWT.io调试器或任何其他尝试验证 JWT 的软件会读取此标头,然后尝试使用算法。如果您使用非标准名称,验证软件将找不到正确的算法。

关于使用JWT.io的注意事项:在将令牌粘贴到左列之前,不要忘记将秘密粘贴到Verify Signature调试器右列下的输入字段中。如果您忘记了密码,则无法验证令牌,如果您将密码粘贴在令牌之后,则左侧的签名可能会被重新计算和更改。


查看完整回答
反对 回复 2022-01-24
  • 1 回答
  • 0 关注
  • 340 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信