【发布时间】:2016-07-10 08:37:33
【问题描述】:
我有一个令牌,一个包含公钥的文件,我想验证签名。 我尝试根据this 验证签名。
但是,decodedCrypto 和 decodedSignature 不匹配。
这是我的代码:
public static string Decode(string token, string key, bool verify)
{
var parts = token.Split('.');
var header = parts[0];
var payload = parts[1];
byte[] crypto = Base64UrlDecode(parts[2]);
var headerJson = Encoding.UTF8.GetString(Base64UrlDecode(header));
var headerData = JObject.Parse(headerJson);
var payloadJson = Encoding.UTF8.GetString(Base64UrlDecode(payload));
var payloadData = JObject.Parse(payloadJson);
if (verify)
{
var bytesToSign = Encoding.UTF8.GetBytes(string.Concat(header, ".", payload));
var keyBytes = Encoding.UTF8.GetBytes(key);
var algorithm = (string)headerData["alg"];
var signature = HashAlgorithms[GetHashAlgorithm(algorithm)](keyBytes, bytesToSign);
var decodedCrypto = Convert.ToBase64String(crypto);
var decodedSignature = Convert.ToBase64String(signature);
if (decodedCrypto != decodedSignature)
{
throw new ApplicationException(string.Format("Invalid signature. Expected {0} got {1}", decodedCrypto, decodedSignature));
}
}
return payloadData.ToString();
}
我确定令牌的签名是有效的。我尝试在https://jwt.io/ 上进行验证,它显示签名已验证。 所以问题是编码、解码的算法。
有没有人能解决这个问题?算法是RS256
【问题讨论】:
-
@Thomas 在另一个线程stackoverflow.com/questions/10055158/… 中报告了最简单的答案。
-
@KarthickJayaraman 我提到了上面的参考,但它不起作用。你不仔细看问题吗?