Как зашифровать полезную нагрузку JWT с помощью ключа Publi c RSA_OAEP_256 - PullRequest
0 голосов
/ 20 апреля 2020

Я использую библиотеки "BouncyCastle.NetCore" и "jose-jwt" для подписи и шифрования веб-токена. Я могу подписаться своим закрытым ключом с помощью кода ниже. но требования также должны выполнять OpenID JWT Encryption. Чтобы зашифровать полезную нагрузку JWT, мы должны сделать это, используя предоставленную строку ключа publi c (base64, декодированный с ключом X509 spe c). кодирование, необходимое для использования алгоритма 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;
    }

}

1 Ответ

0 голосов
/ 23 апреля 2020

Похоже, единственное отличие EncodePayload состоит в том, как полезная нагрузка заканчивается записью в тело JWT. Это true по умолчанию и не влияет на шифрование полезной нагрузки (см. исходный код ):

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

То, что вы, вероятно, хотите, это указать JweAlgorithm и исправьте JweEncryption (обратите внимание, что отличается от перегрузки для той же функции:

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