使用字符串中的公钥验证JWT

au

我有以下格式公钥:----- BEGIN RSA公钥----- MIIBCgKCAQEA1pjRK + cOnEsh5L1wrt1Tmx + FvyNRj4wuAotlqIWtHS8pIqRzsIOJg + tlbUtEXYju + KOcIohZnnmfj0cq28RcQ19HIohqUXypmUbNy9np / M + Aj9NcyKIaNyuEZ + UhcU / OIStHK4eTUJt + RWL + 0Q1 / rl49tg7h + toB9Y6Y3SeytXvZhMx3N5qqmHHNorpfb65bvvHsicGDB7vK5kn55o + C2LhRIxfnw87nKnhPBMRbZg + BKCTXD4svz4a2xiR / uM4rxebIBgb3Sm4X1w3yoRr0F3IDhAgXmEhSZ078wm3ohPfuuwymfVhvdzavm42NwzixZ7n52SowFE2v0DSJh3IbPwIDAQAB ----- ENDRSA

如何使用该字符串实现C#来验证我的JWT?在C#中使用公共密钥验证用RS256算法签名的JWT时发现了类似的主题,但是没有一种解决方案适合我的情况。

有我的代码:

        public static bool TransformKey(string fullKey)
        {
            try
            {
                var publicKey = fullKey.Replace("-----BEGIN RSA PUBLIC KEY-----", "");
                publicKey = publicKey.Replace("-----END RSA PUBLIC KEY-----", "");
                publicKey = publicKey.Replace("\n", "");

                var keyBytes = Convert.FromBase64String(publicKey); // your key here 
                AsymmetricKeyParameter asymmetricKeyParameter = PublicKeyFactory.CreateKey(keyBytes);
                RsaKeyParameters rsaKeyParameters = (RsaKeyParameters)asymmetricKeyParameter;
                RSAParameters rsaParameters = new RSAParameters
                {
                    Modulus = rsaKeyParameters.Modulus.ToByteArrayUnsigned(),
                    Exponent = rsaKeyParameters.Exponent.ToByteArrayUnsigned()
                };
                return true;
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                return false;
            }
        }
      
        static void Main(string[] args)
        {
            // The code provided will print ‘Hello World’ to the console.
            // Press Ctrl+F5 (or go to Debug > Start Without Debugging) to run your app.
            string key = "-----BEGIN RSA PUBLIC KEY-----MIIBCgKCAQEA1pjRK+cOnEsh5L1wrt1Tmx+FvyNRj4wuAotlqIWtHS8pIqRzsIOJg+tlbUtEXYju+KOcIohZnnmfj0cq28RcQ19HIohqUXypmUbNy9np/M+Aj9NcyKIaNyuEZ+UhcU/OIStHK4eTUJt+RWL+0Q1/rl49tg7h+toB9Y6Y3SeytXvZhMx3N5qqmHHNorpfb65bvvHsicGDB7vK5kn55o+C2LhRIxfnw87nKnhPBMRbZg+BKCTXD4svz4a2xiR/uM4rxebIBgB3Sm4X1w3yoRr0F3IDhAgXmEhSZ078wm3ohPfuuwymfVhvdzavm42NwzixZ7n52SowFE2v0DSJh3IbPwIDAQAB-----END RSA PUBLIC KEY-----";
            bool test = TransformKey(key);
            Console.ReadKey();
        }

当我尝试初始化asymmetricKeyParameter对象时,它将返回异常:

System.ArgumentException: Unknown object in GetInstance: Org.BouncyCastle.Asn1.DerInteger
Parameter name: obj
   w Org.BouncyCastle.Asn1.Asn1Sequence.GetInstance(Object obj)
   w Org.BouncyCastle.Asn1.X509.AlgorithmIdentifier.GetInstance(Object obj)
   w Org.BouncyCastle.Asn1.X509.SubjectPublicKeyInfo..ctor(Asn1Sequence seq)
   w Org.BouncyCastle.Asn1.X509.SubjectPublicKeyInfo.GetInstance(Object obj)
   w Org.BouncyCastle.Security.PublicKeyFactory.CreateKey(Byte[] keyInfoData)

字符串类型具有模数和指数的代码片段可能有用:

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            rsa.ImportParameters(
              new RSAParameters()
              {
                  Modulus = FromBase64Url("w7Zdfmece8iaB0kiTY8pCtiBtzbptJmP28nSWwtdjRu0f2GFpajvWE4VhfJAjEsOcwYzay7XGN0b-X84BfC8hmCTOj2b2eHT7NsZegFPKRUQzJ9wW8ipn_aDJWMGDuB1XyqT1E7DYqjUCEOD1b4FLpy_xPn6oV_TYOfQ9fZdbE5HGxJUzekuGcOKqOQ8M7wfYHhHHLxGpQVgL0apWuP2gDDOdTtpuld4D2LK1MZK99s9gaSjRHE8JDb1Z4IGhEcEyzkxswVdPndUWzfvWBBWXWxtSUvQGBRkuy1BHOa4sP6FKjWEeeF7gm7UMs2Nm2QUgNZw6xvEDGaLk4KASdIxRQ"),
                  Exponent = FromBase64Url("AQAB")
              });
托帕可

在.NET Framework(例如4.7.2)的情况下,可以使用BouncyCastle(例如v1.8.6.1)导入公共PKCS#1密钥:

using System.IO;
using System.Security.Cryptography;

using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.OpenSsl;
using Org.BouncyCastle.Security;

...

string publicPKCS1 = @"-----BEGIN RSA PUBLIC KEY-----
                       MIIBCgKCAQEA1pjRK+cOnEsh5L1wrt1Tmx+FvyNRj4wuAotlqIWtHS8pIqRzsIOJ
                       g+tlbUtEXYju+KOcIohZnnmfj0cq28RcQ19HIohqUXypmUbNy9np/M+Aj9NcyKIa
                       NyuEZ+UhcU/OIStHK4eTUJt+RWL+0Q1/rl49tg7h+toB9Y6Y3SeytXvZhMx3N5qq
                       mHHNorpfb65bvvHsicGDB7vK5kn55o+C2LhRIxfnw87nKnhPBMRbZg+BKCTXD4sv
                       z4a2xiR/uM4rxebIBgB3Sm4X1w3yoRr0F3IDhAgXmEhSZ078wm3ohPfuuwymfVhv
                       dzavm42NwzixZ7n52SowFE2v0DSJh3IbPwIDAQAB
                       -----END RSA PUBLIC KEY-----";

PemReader pemReader = new PemReader(new StringReader(publicPKCS1));
AsymmetricKeyParameter asymmetricKeyParameter = (AsymmetricKeyParameter)pemReader.ReadObject();
RSAParameters rsaParameters = DotNetUtilities.ToRSAParameters((RsaKeyParameters)asymmetricKeyParameter);

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(rsaParameters);

...

可以使用JWT库(例如System.IdentityModel.Tokens.Jwt)或纯加密API来完成JWT的验证链接问题的答案中都详细描述了两者关于前者,另见此处第二段。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用字符串生成公钥和私钥

Nodejs使用公钥字符串构造公钥

使用公钥验证端点签名JWT

使用给定的RSA公钥OpenSSL加密字符串

如何使用 python Openssl 公钥加密字符串?

如何使用公钥字符串创建OpenSSL :: PKey?

使用PHP生成公钥/私钥对并将公钥导出为.der编码的字符串

从字符串生成Rsa公钥

从字符串创建RSA公钥

C#通过签名和RSA公钥验证Json字符串

使用C#中的公钥验证用RS256算法签名的JWT

在 C++ 中通过 openSSL 使用公钥验证 JWT 令牌时出现分段错误

Node JS JWT使用Google的公钥验证令牌

Veridis Biometrics SDK使用字符串进行验证

如何使用字符串和整数验证python中的数据?

如何使用字符串中的多个变量来验证HTML内容

如何在Go中从x509证书公钥中获取字符串?

使用Objective C在iOS中使用公钥加密或签名字符串

Java从字符串中删除公钥标题和页脚

通过PEM字符串在Java中创建DSA公钥

从Haskell中的PEM Base64Encode字符串创建公钥/私钥

无法在量角器中使用公钥加密字符串

如何使用OpenSSL API从其PEM格式字符串读取RSA公钥?

如何使用Bouncycastle Java将PGP公钥存储和读取为字符串?

Java-使用现有的公钥文件加密字符串

使用Java将RSA公钥导出到PEM字符串

如何使用BouncyCastle C#将RSA公钥转换为字符串

如何在iOS中使用RSA公钥加密和解密字符串(纯文本)

Android Java-使用RSA公钥.PEM加密字符串