Пользовательский JWT IN PHP постоянно говорит неверная подпись - PullRequest
1 голос
/ 24 сентября 2019

Я новичок в этом и стараюсь изо всех сил создать свой собственный класс 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-4HNxgzhqYaIQKTImwO8A8SHIZfVYz2iG57A4tQm0

1016 * Я даже попытался изменить алгоритм в заголовке й HS256 или HS384, а затем жесткого кодирования изменения внутри функции, это не имеет никакого значения

Любые консультациибыл бы признателен

1 Ответ

0 голосов
/ 24 сентября 2019

В вашем коде вы используете хеширование HMAC, которое принимает параметр алгоритма sha256 или sha384.Эти имена алгоритмов не идентичны именам алгоритмов, которые можно использовать в JWT.

В RFC 7517 раздел 4.1.1 вы можете прочитать о заголовке alg:

Список определенных значений «alg» для этого использования можно найти в реестре IANA «Алгоритмы веб-подписи и шифрования JSON», созданном [JWA];начальным содержимым этого реестра являются значения, определенные в разделе 3.1 [JWA].

В соответствии с RFC7518, раздел 3.1 для алгоритмов HMAC ShaXXX, вы используете HSXXXНапример, HS256 или HS384

Отладчик JWT.io или любое другое программное обеспечение, которое пытается проверить, что JWT читает этот заголовок, а затем пытается с алгоритмом.Если вы используете нестандартное имя, программное обеспечение для проверки не может найти правильный алгоритм.

Примечание относительно использования JWT.io : не забудьте вставить секрет вВ поле ввода под Verify Signature в правом столбце отладчика, за до вы вставляете токен в левый столбец.Если вы забудете секрет, токен не может быть проверен, и если вы вставите секрет после токена, подпись может быть пересчитана и изменена на левой стороне.

...