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

У меня возникли проблемы с проверкой подписи полученного токена 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=

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


person mathis    schedule 26.08.2020    source источник


Ответы (1)


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

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

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

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

person jps    schedule 26.08.2020
comment
Спасибо за быстрый ответ. Я попробовал с Base64Url, и это сработало. - person mathis; 26.08.2020