是否可以在 Php 中加密 JWT 令牌并在 Javascript 中解密?
Is it Possible to Encrypt a JWT token in Php And Decrypt in Javascript?
我目前正在为 JWT 使用两个库。服务器端的第一个
第二个用于客户端
我正在创建一个基于令牌的登录系统。我想要的只是在服务器端创建一个令牌,并在使用 JWE(JSON WEB ENCRYPTION) return 加密后将该令牌发送到客户端并保存到 html5 本地存储。
问题是解密 javascript JOSE 库
中的加密令牌
因为一个JWE是标准格式,那么从一个平台(PHP, Java, JS...)发出JWE并读取它是没有问题的另一个。
这里唯一的问题是
- 您必须为要使用的每个平台找到一个库。
- 这些库必须有共同的算法
我不知道 nov/jose-php 但代码审查和我执行的测试表明它支持一些众所周知的算法 (RSA1_5
/RSA-OAEP
/dir
用于密钥加密和 A128CBC-HS256
/A256CBC-HS512
用于内容加密)。
如果您在项目中使用 RSA-OAEP
和 A128CBC-HS256
或 A256CBC-HS512
,那么您应该能够在一侧加密并在另一侧解密。
如果你想在 PHP 上使用其他算法,例如 AxxxKW
或 AxxxGCM
,你应该看看 spomky-labs/jose PHP 库支持多种算法、压缩等。
您还应该查看 jwt.io,其中列出了多个平台上的大量 Jose 实现。
编辑
Private/Public RSA 密钥转换器
<?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
我目前正在为 JWT 使用两个库。服务器端的第一个
第二个用于客户端
我正在创建一个基于令牌的登录系统。我想要的只是在服务器端创建一个令牌,并在使用 JWE(JSON WEB ENCRYPTION) return 加密后将该令牌发送到客户端并保存到 html5 本地存储。
问题是解密 javascript JOSE 库
中的加密令牌因为一个JWE是标准格式,那么从一个平台(PHP, Java, JS...)发出JWE并读取它是没有问题的另一个。
这里唯一的问题是
- 您必须为要使用的每个平台找到一个库。
- 这些库必须有共同的算法
我不知道 nov/jose-php 但代码审查和我执行的测试表明它支持一些众所周知的算法 (RSA1_5
/RSA-OAEP
/dir
用于密钥加密和 A128CBC-HS256
/A256CBC-HS512
用于内容加密)。
如果您在项目中使用 RSA-OAEP
和 A128CBC-HS256
或 A256CBC-HS512
,那么您应该能够在一侧加密并在另一侧解密。
如果你想在 PHP 上使用其他算法,例如 AxxxKW
或 AxxxGCM
,你应该看看 spomky-labs/jose PHP 库支持多种算法、压缩等。
您还应该查看 jwt.io,其中列出了多个平台上的大量 Jose 实现。
编辑
Private/Public RSA 密钥转换器
<?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