我必须为JWT创建数字签名。使用以下模式:
BASE64URLENCODE( HMACSHA256( BASE64URLENCODE(<header>) + "." + BASE64URLENCODE(<payload>), <symmetric key> ) )
那时候,我有一个不错的头和有效负载,但是当我必须构建签名时,我遇到了问题。我没有很好地使用钥匙。我知道,因为当我去检查在JWT.io中创建的JWT时,我的签名无效,并且当我将密钥粘贴到“验证签名”中时,Jwt才能正常工作。
顺便说一句,我不能使用诸如System.IdentityModel.Tokens.Jwt
或jose-jwt
之类的库,因为我的有效载荷是这样的:
{
"reqHeader": {
"locale": "en",
"orgAlias": "2db00d5d-c87e-4cb2-800c-0141e963d374",
"secretKey": "ade01e1840d246458c1b2bb0f482186c",
"timestamp": "19-Jul-19 10:11:22 AM",
"version": "4.9"
},
"reqBody": {
"getSameDeviceUsers": false,
"userName": "b39ee4f9-daa1-4fcd-b9a4-5f9a878e1bd0",
"clientData": "Session data echoed back to te requestor"
}
}
这不是经典的声明,而且我不知道如何在声明中声明这些对象。
这是我创建签名的方式:
byte[] bytesSecretKey = Encoding.ASCII.GetBytes(secretKey);
var hash = new HMACSHA256(bytesSecretKey);
var base64Body = base64Header + "." + base64Payload;
byte[] bytesBody = Encoding.ASCII.GetBytes(base64Body);
var sha256Base64 = hash.ComputeHash(bytesBody);
var signatureJwt = Base64UrlEncoder.Encode(sha256Base64);
var response = base64Header + "." + base64Payload + "." + signatureJwt;
在那之后,我有一个不好的回应。 我该如何实施这种事情?有图书馆吗?