我目前正在为 JWT 使用两个库。第一个用于服务器端
第二个用于客户端
我正在创建一个基于令牌的登录系统。我想要的只是在服务器端创建一个令牌,并在使用 JWE(JSON WEB ENCRYPTION) 加密后将该令牌返回给客户端并保存到 html5 本地存储。
问题是解密 javascript JOSE 库中的加密令牌
我目前正在为 JWT 使用两个库。第一个用于服务器端
第二个用于客户端
我正在创建一个基于令牌的登录系统。我想要的只是在服务器端创建一个令牌,并在使用 JWE(JSON WEB ENCRYPTION) 加密后将该令牌返回给客户端并保存到 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
or AxxxGCM
,你应该看看spomky-labs/jose PHP 库,它支持十几种算法、压缩等等。
您还应该查看jwt.io,其中列出了多个平台上的许多 Jose 实现。
私有/公共 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