Розшифровка JWT HS256 та звіряння сигнатури sha256

JWT (JSON Web Token) має три компоненти, розділених точками: заголовок, корисне навантаження (payload) та підпис. Підпис є шифрованим хешом від перших двох компонентів, використовуючи ключ.

При створенні токена сервер формує заголовок і корисне навантаження, записує їх у формат JSON і кодує змінений BASE64. Це дає два рядки, які поєднуються через точку. Потім формується підпис від загального рядка з використанням вказаного в заголовку алгоритму. Підпис додається через точку, створюючи повний токен.

При отриманні запиту з токеном сервер розбиває токен на компоненти, розшифровує заголовок та визначає алгоритм підпису. Потім сервер обчислює контрольний підпис від перших двох компонентів токена і порівнює його з тим, що вказано в токені. Якщо вони збігаються, то токен вважається дійсним.

При використанні симетричного алгоритму обидва сервери знають той самий ключ - сервер, який генерує токен, і сервер, який його перевіряє. Асиметричне шифрування дозволяє створювати токени на одному сервері з використанням закритого ключа та перевіряти їх на іншому сервері з використанням відповідного відкритого ключа.

Приклад токена:

$token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0Nwid WF0IjoxNTE2MjM5MDIyfQ.qeDJnxS97205riRwowv_szvCv-h2IiPqAAnhFA214CI';

Секретний ключ, яким було зашифровано:

$key = 'private_key';< /p>

Розглянемо обробку та звіряння сигнатур:

<?php
$token = 'Наведено вище';
$key = 'Наведено вище';

// Розділяємо наш token на 3 змінні
$jwtArr = array_combine(['header', 'payload', 'signature'], explode('.', $token));

// base64_decode($jwtArr['header']) - заголовок
// {"alg":"HS256","typ":"JWT"}
//
// base64_decode($jwtArr['payload']) - тiло
// {"alg":"HS256","typ":"JWT"}
//
// $jwtArr['signature'] - підпис на основі секретного ключа, $key
// qeDJnxS97205riRwowv_szvCv-h2IiPqAAnhFA214CI

$calculatedHash = hash_hmac(
        'sha256',
        $jwtArr['header'] . '.' . $jwtArr['payload'],
        $key,
        true);

// sha256 суму, кодуємо в base64 і наводимо до повної версії
$calcSign = convertBase64UrlToBase64(base64_encode($calculatedHash));

// Наводимо до повної версії сигнатуру, яка була в коді
$unswerS = convertBase64UrlToBase64($jwtArr['signature']);

if ($calcSign === $unswerS) {
    die("Сигнатура збіглася, цілісність не порушена");
} else {
    die("Сигнатура НЕ збіглася, цілісність ПОРУШЕНА");
}

// Приводить обрізану base64 у нормальну
function convertBase64UrlToBase64($input) {
    $remainder = \strlen($input) % 4;
    if ($remainder) {
        $padlen = 4 - $remainder;
        $input .= \str_repeat('=', $padlen);
    }
    return \strtr($input, '-_', '+/');
}

Шляхом обчислення SHA-256 хешу для об'єднаних перших двох частин токена із застосуванням відповідного ключа можна переконатися, що цей хеш збігається з першою частиною токену, що підтверджує відсутність змін у перших двох частинах.

Сервіс для онлайн кодування jwt для тестів.

Бібліотека з готовими рішеннями firebase /php-jwt

Джерело

1235 0

Відгуки

Поки немає жодного відгуку. Станьте першим!
Тільки авторизовані користувачі можуть залишати відгуки Вхід

Схожі статті

Створити та завантажити CSV на PHP

Розглянемо можливість швидкого створення CSV файлу з автоматичним скачуванням файлу. Розглянемо формування, роздільники та header для можливості завантажити файл.

Шаблони ImageCMS 4.10-4.12.1

Останні шаблони від ImageCMS 4.12, для завантаження потрібна авторизація.

Довге зберігання кошика в інтернет-магазині

Розглянемо варіанти популярних варіантів зберігання товарів у кошику в інтернет-магазині. Позначимо плюси та мінуси таких зберігання. Розглянемо варіанти довгострокового зберігання корзини.