为JWT构建数字签名

时间:2019-07-19 11:10:38

标签: c# jwt sha256 hmac base64url

我必须为JWT创建数字签名。使用以下模式:

BASE64URLENCODE( HMACSHA256( BASE64URLENCODE(<header>) + "." + BASE64URLENCODE(<payload>), <symmetric key> ) )

那时候,我有一个不错的头和有效负载,但是当我必须构建签名时,我遇到了问题。我没有很好地使用钥匙。我知道,因为当我去检查在JWT.io中创建的JWT时,我的签名无效,并且当我将密钥粘贴到“验证签名”中时,Jwt才能正常工作。

顺便说一句,我不能使用诸如System.IdentityModel.Tokens.Jwtjose-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;

在那之后,我有一个不好的回应。 我该如何实施这种事情?有图书馆吗?

0 个答案:

没有答案