Как создать веб-подпись JSON (JWS) в ASP.NET MVC и C#

Я новичок в концепции JWS, и меня попросили создать фрагмент для подписи JSON в C#. У нас будет несколько подписей, поэтому каждый раз, когда подписывается полезная нагрузка JSON, она будет добавляться в подписи.

Я проверил сериализацию JWS JSON и то, как ее можно использовать в случаях для нескольких подписей.

Ниже приведен код, используемый для подписи и шифрования:

// Checking if the request contains body, usually will be null wiht HTTP GET and DELETE
if (request.Content != null)
{
    byte[] content = await request.Content.ReadAsByteArrayAsync();
    MD5 md5 = MD5.Create();

    // Hashing the request body, any change in request body will result in different hash, we'll ensure message integrity
    byte[] requestContentHash = md5.ComputeHash(content);
    requestContentBase64String = Convert.ToBase64String(requestContentHash);
}

// Creating the raw signature string
string signatureRawData = String.Format("{0}{1}{2}{3}{4}{5}", APPId, requestHttpMethod, requestUri, requestTimeStamp, nonce, requestContentBase64String);

var secretKeyByteArray = Convert.FromBase64String(APIKey);

byte[] signature = Encoding.UTF8.GetBytes(signatureRawData);

using (HMACSHA256 hmac = new HMACSHA256(secretKeyByteArray))
{
    byte[] signatureBytes = hmac.ComputeHash(signature);
    string requestSignatureBase64String = Convert.ToBase64String(signatureBytes);

    // Setting the values in the Authorization header using custom scheme (amx)
    request.Headers.Authorization = new AuthenticationHeaderValue("amx", string.Format("{0}:{1}:{2}:{3}", APPId, requestSignatureBase64String, nonce, requestTimeStamp));
}

response = await base.SendAsync(request, cancellationToken);

Но как мы реализуем подпись JSON?

Мне нужна помощь в реализации того, как мы используем логику SignedXML для подписи документов XML с сертификатом x509.

1 ответ

Решение

Я взял диаграмму отсюда https://jwt.io/index.html

JSON Web Tokens - это открытый промышленный стандарт RFC 7519 для безопасного представления заявок между двумя сторонами.

JWT.IO позволяет декодировать, проверять и генерировать JWT.

Попробуйте пакет Nuget jose-jwt.

var payload = new Dictionary<string, object>()
{
    { "sub", "mr.x@contoso.com" },
    { "exp", 1300819380 }
};

string token = Jose.JWT.Encode(payload, null, JwsAlgorithm.none);
Другие вопросы по тегам