是否可以用Php加密JWT令牌并用Javascript解密

Is it Possible to Encrypt a JWT token in Php And Decrypt in Javascript?

本文关键字:令牌 Javascript 解密 JWT 加密 Php 是否      更新时间:2023-09-26

我目前正在为JWT使用两个库。第一个用于服务器端

jose-php库

第二个用于客户端

jose-js库

我正在创建一个基于令牌的登录系统。我只想在服务器端创建一个令牌,并在使用JWE(JSON WEB ENCRYPTION(加密后将该令牌返回到客户端并保存到html5本地存储中。

问题是解密javascript JOSE库中的加密令牌

因为JWE是一种标准格式,所以从一个平台(PHP、Java、JS…(发出JWE并用另一个平台读取它是没有问题的。

这里唯一的问题是

  • 你必须为你想要使用的每个平台找到一个库
  • 这些库必须具有通用算法

我不知道nov/josephp,但我进行的代码审查和测试表明,它支持一些众所周知的算法(RSA1_5/RSA-OAEP/dir用于密钥加密,A128CBC-HS256/A256CBC-HS512用于内容加密(。

如果您在项目中使用RSA-OAEPA128CBC-HS256A256CBC-HS512,那么您应该能够在一侧加密,在另一侧解密。

如果你想在PHP上使用其他算法,如AxxxKWAxxxGCM,你应该看看spomky-labs/jose PHP库,它支持十几种算法、压缩等。

您还应该看看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