Я очень новичок в JWT и проводил исследования по этому вопросу, но не смог найти правильного решения. У меня есть JWT, срок его действия уже истек, но когда я проверяю подпись на JWT.IO с помощью открытого ключа, он проверяется. Алгоритм RS256. Когда я нахожусь на JWT.io, я обертываю открытый ключ с помощью «--- BEGIN CERTIFICATE ----» и «--- END CERTIFICATE ----», и он проверяет JWT.
Теперь я пытаюсь сделать то же самое на C #, используя следующую функцию:
public string Decode(string token, string key, bool verify = true)
{
string[] parts = token.Split('.');
string header = parts[0];
string payload = parts[1];
byte[] crypto = Base64UrlDecode(parts[2]);
string headerJson = Encoding.UTF8.GetString(Base64UrlDecode(header));
JObject headerData = JObject.Parse(headerJson);
string payloadJson = Encoding.UTF8.GetString(Base64UrlDecode(payload));
JObject payloadData = JObject.Parse(payloadJson);
if (verify)
{
var keyBytes = Convert.FromBase64String(key); // your key here
AsymmetricKeyParameter asymmetricKeyParameter = PublicKeyFactory.CreateKey(keyBytes);
RsaKeyParameters rsaKeyParameters = (RsaKeyParameters)asymmetricKeyParameter;
RSAParameters rsaParameters = new RSAParameters();
rsaParameters.Modulus = rsaKeyParameters.Modulus.ToByteArrayUnsigned();
rsaParameters.Exponent = rsaKeyParameters.Exponent.ToByteArrayUnsigned();
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(rsaParameters);
SHA256 sha256 = SHA256.Create();
byte[] hash = sha256.ComputeHash(Encoding.UTF8.GetBytes(parts[0] + '.' + parts[1]));
RSAPKCS1SignatureDeformatter rsaDeformatter = new RSAPKCS1SignatureDeformatter(rsa);
rsaDeformatter.SetHashAlgorithm("SHA256");
if (!rsaDeformatter.VerifySignature(hash, Convert.FromBase64String(parts[2])))
throw new ApplicationException(string.Format("Invalid signature"));
}
return payloadData.ToString();
}
Однако строка AsymmetricKeyParameter asymmetricKeyParameter = PublicKeyFactory.CreateKey (keyBytes); выдает исключение с сообщением «Неверный размер последовательности: 3
Имя параметра: seq ".
Кто-нибудь знает, почему это происходит, или любой другой правильный способ подписать JWT?
Спасибо!