проверить подпись токена JWT c #

Aug 26 2020

У меня возникли проблемы с проверкой подписи полученного токена JWT. Маркер подписан HS256. Код, в котором я пытаюсь создать подпись для подтверждения полученной подписи:

JwtSecurityToken token = tokenHandler.ReadJwtToken(tokenString);

byte[] keyBytes = Encoding.UTF8.GetBytes("secret");

HMACSHA256 hmac = new HMACSHA256(keyBytes);
byte[] signatureBytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(token.RawHeader + "." + token.RawPayload));
string signature = Convert.ToBase64String(signatureBytes);

Подпись, которую я получаю из полученного токена, например:

pYscLlinuNhO-sFyEIRRLZP7yrl8GopGJ3I6QSxg2tU

Но подпись, которую я получаю от своего алгоритма, в этом случае:

pYscLlinuNhO+sFyEIRRLZP7yrl8GopGJ3I6QSxg2tU=

Так что подписи близкие, но не равные. Я не понимаю, что делаю неправильно при проверке подписи. Буквы и цифры кажутся правильными каждый раз, но специальные символы в основном разные, и в конце подписи всегда стоит знак '='. Может кто знает, что я делаю не так.

Ответы

1 jps Aug 26 2020 at 19:16

Три части JWT закодированы в Base64Url :

JWT представлен как последовательность URL-безопасных частей, разделенных символами точки ('.'). Каждая часть содержит значение в кодировке base64url.

Но вы использовали кодировку Base64 . Base64Url использует '-' и '_' вместо '+' и '/', а также опускает заполнение '=' в конце.

Вот пример того, как преобразовать кодировку base64 в кодировку bas64url в C #