我有一个 ASP.Net 应用程序,我正在使用这个库:https ://github.com/dvsekhvalnov/jose-jwt创建一个加密的 JWT,如下所示:
JWT.Encode("some_text_to_encrypt", publicKey, JweAlgorithm.RSA_OAEP_256, JweEncryption.A256CBC_HS512);
publicKey只是我从公共 JWK 创建的 RSA 密钥。
我想知道是否有一种方法可以通过使用普通的 .Net Framework 而不是这个库来生成相同格式的加密 JWT。我尝试使用Microsoft.IdentityModel.Tokens和System.IdentityModel.Tokens命名空间,例如:
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
RSAParameters keyParams = new RSAParameters()
{
Modulus = FromBase64Url(jsonWebKey["n"].ToString()),
Exponent = FromBase64Url(jsonWebKey["e"].ToString())
};
rsa.ImportParameters(keyParams);
var publicKey = new RsaSecurityKey(rsa);
var tokenDescriptor = new SecurityTokenDescriptor
{
Audience = "Audience",
Expires = DateTime.UtcNow + TimeSpan.FromHours(1),
Issuer = "Issuer",
IssuedAt = DateTime.UtcNow,
Claims = new Dictionary<string, object> { { "val", "some_text_to_encrypt" } },
EncryptingCredentials = new EncryptingCredentials(publicKey, SecurityAlgorithms.RsaOAEP, SecurityAlgorithms.Aes256CbcHmacSha512),
};
var handler = new JwtSecurityTokenHandler();
jwt = handler.CreateEncodedJwt(tokenDescriptor);
但是我意识到这个方法的输出与 jose-jwt 库的Encode方法产生的输出格式不同。我是否遗漏了什么,或者这不是在.Net 中创建相同加密 JWT 的方法?
当我尝试使用相同的jose-jwt库来解密上面生成的 JWT 时,而不是获取解密的有效负载(“some_text_to_encrypt”),我得到另一个 JWT,其有效负载中的值:
Result after decrypting: eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJ2YWwiOiJzb21lX3RleHRfdG9fZW5jcnlwdCIsIm5iZiI6MTYxODkzNjk0NywiZXhwIjoxNjE4OTQwNTQyLCJpYXQiOjE2MTg5MzY5NDIsImlzcyI6Iklzc3VlciIsImF1ZCI6IkF1ZGllbmNlIn0.
然后我可以在jwt.io中解码以获得以下结果:
标题:{“alg”:“none”,“typ”:“JWT”}有效负载:{“val”:“some_text_to_encrypt”,“nbf”:1618936947,“exp”:1618940542,“iat”:1618936942,“iss ": "发行者", "aud": "受众" }