我正在尝试验证在 C# 中使用 RSA256 签名的 JWT 令牌。令牌是在 Javascript 中使用名为 Jose-jwt 的 jwt 库在服务器端创建的。我正在使用 C# 的 System.Security.Cryptography 命名空间类在 WinForms 应用程序中验证令牌。我尝试将 jose-jwt 用于 C#,但显然它不支持从 PEM 编码文件加载密钥。
这是我的验证码:
public static string IsCertValid()
{
string token = System.IO.File.ReadAllText(TokenLocation);
var stream = System.IO.File.OpenRead(PublicKeyLocation);
var reader = new PemReader(stream);
var rsaParameters = reader.ReadRsaKey();
var rsa = System.Security.Cryptography.RSA.Create();
rsa.ImportParameters(rsaParameters);
string[] tokenparts = token.Split('.');
byte[] signature = Encoding.UTF8.GetBytes(tokenparts[2]);
string dataToVerify = tokenparts[0] + '.' + tokenparts[1];
byte[] bytesToVerify = Encoding.UTF8.GetBytes(dataToVerify);
//string decoded = JWT.Decode(token,rsaParameters);
bool result = rsa.VerifyData(bytesToVerify, signature, System.Security.Cryptography.HashAlgorithmName.SHA256, System.Security.Cryptography.RSASignaturePadding.Pkcs1);
return result.ToString();
}
这验证为假,即使我知道令牌对此密钥有效。是否需要使用私钥进行验证?这似乎不太安全。我究竟做错了什么?任何帮助将不胜感激。