Можно ли зашифровать токен JWT в Php и расшифровать в Javascript?

В настоящее время я использую две библиотеки для JWT . Первый для серверной части

jose php библиотека

а второй для стороны клиента

Jose JS библиотека

Я создаю систему авторизации на основе токенов. Все, что я хочу, это создать токен на стороне сервера и после шифрования с помощью JWE(JSON WEB ENCRYPTION) вернуть этот токен клиенту и сохранить его в локальном хранилище html5.

проблема в том, чтобы расшифровать зашифрованный токен в javascript JOSE Library

1 ответ

Решение

Поскольку JWE является стандартным форматом, нет проблем с выпуском JWE с платформы (PHP, Java, JS...) и чтением его с другой.

Единственная проблема здесь в том, что

  • Вы должны найти библиотеку для каждой платформы, которую вы хотите использовать.
  • эти библиотеки должны иметь общие алгоритмы

Я не знаю nov / jose-php, но обзор кода и выполненные мною тесты показывают, что он поддерживает некоторые известные алгоритмы (RSA1_5 / RSA-OAEP / dir для шифрования ключей и A128CBC-HS256 / A256CBC-HS512 для шифрования контента).

Если вы используете RSA-OAEP а также A128CBC-HS256 или же A256CBC-HS512 в вашем проекте, то вы должны иметь возможность шифровать с одной стороны и расшифровать с другой стороны.

Если вы хотите использовать другие алгоритмы на PHP, такие как AxxxKW или же AxxxGCMВы должны взглянуть на PHP-библиотеку https://github.com/Spomky-Labs/jose, которая поддерживает дюжину алгоритмов, сжатие и многое другое.

Вам также следует взглянуть на jwt.io, в котором перечислены многие реализации Jose на нескольких платформах.

редактировать

Частный / Общественный Конвертер ключей RSA

С spomky-labs/jose:

<?php
use Jose\Factory\JWKFactory;
$key = JWKFactory::createFromKeyFile('/path/to/your/key.pem');
// The variable $key is a JWKInterface instance that can be easily converted into a JSON object: json_encode($key)

В чистом PHP:

<?php
$res = openssl_pkey_get_private($data);
if (false === $res) {
    $res = openssl_pkey_get_public($data);
}
// Verify here that $res is not false.


$details = openssl_pkey_get_details($res);
//Verify here that the array $details has a key 'rsa' (could be 'ec')

$components = [
    'n'  => 'n',
    'e'  => 'e',
    'd'  => 'd',
    'p'  => 'p',
    'q'  => 'q',
    'dp' => 'dmp1',
    'dq' => 'dmq1',
    'qi' => 'iqmp',
];

$key = ['kty' => 'RSA'];
foreach ($details['rsa'] as $key => $value) {
    if (in_array($key, $components)) {
        $key[array_search($key, $components)] = Base64Url::encode($value); // Base64 Url Safe encoding. See https://github.com/Spomky-Labs/base64url
    }
}
// The variable $key is an array with the expected information
Другие вопросы по тегам