Как создать веб-подпись 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);