【问题标题】:How to Encryption JWT Payload with Public Key RSA_OAEP_256如何使用公钥 RSA_OAEP_256 加密 JWT 有效负载
【发布时间】:2020-08-03 02:03:14
【问题描述】:

我正在使用“BouncyCastle.NetCore”和“jose-jwt”库来签署和加密网络令牌。我可以通过以下代码使用我的私钥签名。但是要求还执行 OpenID JWT 加密 为了加密 JWT 有效负载,我们需要使用提供的公钥字符串(使用 X509 密钥规范进行 base64 解码)来执行此操作。 使用 RSA 算法和 JWE 标头所需的编码应包括标头名称“alg”,其值为:RSA_OAEP_256。 下面的代码只用私钥签名,但不知道如何完成编码??

 class Program
{
    string publicKeyString = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0FPqri0cb2JZfXJ/DgYSF6vUpwmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/3j+skZ6UtW+5u09lHNsj6tQ51s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQAB";
    public static async Task Main(string[] args)
    {
        var payload = new System.Collections.Generic.Dictionary<string, object>()
            {
                { "sub", "Testmr.x@contoso.com" },
                { "iss", "https://www.YourBrand.com" },
                { "exp", 1300819380 },
                { "iat", 1446111752 },
                { "preferred_username", "JohnDoe2" },
                { "phone_number", "+2-10-344-3765333" }
            };
        var token = CreateToken(payload);
        Console.WriteLine($"token={token}");
    }
    public static string CreateToken(object payload)
    {
        string jwt = string.Empty;
        var fileStream = System.IO.File.OpenText("C:\\temp\\my_private_key.pem");
        var pemReader = new Org.BouncyCastle.OpenSsl.PemReader(fileStream, new MyPasswordFinder());
        var keyPair = (Org.BouncyCastle.Crypto.AsymmetricKeyParameter)pemReader.ReadObject();
        RSAParameters rsaParams = DotNetUtilities.ToRSAParameters((RsaPrivateCrtKeyParameters)keyPair);
        using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
        {
            rsa.ImportParameters(rsaParams);                
            jwt = JWT.Encode(payload, rsa, JwsAlgorithm.RS256);//,options: new JwtOptions { EncodePayload = true }
        }
        return jwt;
    }

}

【问题讨论】:

标签: c# .net-core jwt bouncycastle jose


【解决方案1】:

EncodePayload 的唯一区别似乎是有效负载最终是如何写入 JWT 主体的。是true by default,不影响payload加密(见source code):

return jwtOptions.EncodePayload
            ? Compact.Serialize(headerBytes, payloadBytes, signature)
            : Compact.Serialize(headerBytes, Encoding.UTF8.GetString(payloadBytes), signature);

您可能想要指定JweAlgorithm 并更正JweEncryption(注意,它是同一函数的different overload

jwt = JWT.Encode(payload, rsa, JweAlgorithm.RSA_OAEP_256, JweEncryption.A256GCM);

【讨论】:

  • 我认为这不能回答我的问题,我有一个私有 PEM/公共 PEM 以及另一个 RSA 公钥。我需要签名/编码/并加密令牌。我的代码中缺少的部分是加密部分(我总结我们需要 JWE 和 JWS 作为有效负载)。此外,您上面的代码不起作用得到错误“指定的填充模式对此算法无效”
  • 是的,在我意识到存在差异之前,我已经在完整的框架上对其进行了测试。你介意试试JweAlgorithm.RSA_OAEP 吗?我知道这不是您所追求的,但它似乎在 .net 核心中对我有用,我只想至少了解结果是否与您的期望有些相似
  • 很遗憾,您的代码无法与我一起使用,即使它有效也无法回答我的问题。
猜你喜欢
  • 2016-03-12
  • 1970-01-01
  • 2020-06-17
  • 2015-08-07
  • 2021-09-05
  • 2018-10-17
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
相关资源
最近更新 更多