Насколько я понимаю, это простой процесс проверки подписи JWT
. Но когда я использую некоторые онлайн-инструменты, чтобы сделать это для меня, это не совпадает. Как я могу вручную проверить подпись JWT
без использования библиотеки JWT? Мне нужен быстрый метод (с использованием доступных онлайн-инструментов), чтобы продемонстрировать, как это делается.
Я создал свой JWT
на https://jwt.io/#debugger-io со следующей информацией:
- Алгоритм:
HS256
- Секрет:
hONPMX3tHWIp9jwLDtoCUwFAtH0RwSK6
- Заголовок:
{
"alg": "HS256",
"typ": "JWT"
}
- Полезная нагрузка:
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
- Проверка подписи (раздел):
- Секретное значение изменено на выше
- Закодированный секретный код base64 (независимо от того, установлен этот флажок или нет, по-прежнему получают другое значение)
JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.wDQ2mU5n89f2HsHm1dluHGNebbXeNr748yJ9kUNDNCA
Вручную JWT
попытка проверки подписи:
Использование калькулятора base64UrlEncode (http://www.simplycalc.com/base64url-encode.php или https://www.base64encode.org/)
Если я: (Не фактическое значение на сайтах, изменено, чтобы показать, что инструменты в конечном итоге создадут для меня)
base64UrlEncode("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9") + "." + base64UrlEncode("eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ")
Я получаю:
ZXlKaGJHY2lPaUpJVXpJMU5pSXNJblI1Y0NJNklrcFhWQ0o5.ZXlKemRXSWlPaUl4TWpNME5UWTNPRGt3SWl3aWJtRnRaU0k2SWtwdmFHNGdSRzlsSWl3aWFXRjBJam94TlRFMk1qTTVNREl5ZlE=
ПРИМЕЧАНИЕ: с моей стороны есть некоторая путаница, если я должен кодировать уже закодированные значения или использовать уже закодированные значения как есть.
(т. Е. С использованием base64UrlEncode("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9") + "." + base64UrlEncode("eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ")
против "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ"
).
Независимо от того, на котором я должен сделать, конечный результат все еще не соответствует подписи. Я склоняюсь к тому, что мне следует НЕ перекодировать закодированное значение, правда это или нет.
Затем с помощью калькулятора HMAC Generator (https://codebeautify.org/hmac-generator или https://www.freeformatter.com/hmac-generator.html#ad-output)
(Не фактическое значение на сайтах, изменено, чтобы показать, что инструменты в конечном итоге создадут для меня)
HMACSHA256(
"ZXlKaGJHY2lPaUpJVXpJMU5pSXNJblI1Y0NJNklrcFhWQ0o5.ZXlKemRXSWlPaUl4TWpNME5UWTNPRGt3SWl3aWJtRnRaU0k2SWtwdmFHNGdSRzlsSWl3aWFXRjBJam94TlRFMk1qTTVNREl5ZlE=",
"hONPMX3tHWIp9jwLDtoCUwFAtH0RwSK6"
)
Что меня достает:
a2de322575675ba19ec272e83634755d4c3c2cd74e9e23c8e4c45e1683536e01
И это не соответствует сигнатурной части JWT
:
wDQ2mU5n89f2HsHm1dluHGNebbXeNr748yJ9kUNDNCAM
! = a2de322575675ba19ec272e83634755d4c3c2cd74e9e23c8e4c45e1683536e01
Назначение:
Причина, по которой мне нужно это подтвердить, состоит в том, чтобы доказать способность подтвердить, что JWT
не был подделан, без расшифровки JWT
.
Моему клиентскому веб-интерфейсу не нужно декодировать JWT
, поэтому им не нужно устанавливать jwt пакет для этого. Им просто нужно сделать простую проверку, чтобы подтвердить, что JWT
не был подделан (хотя это маловероятно), прежде чем они сохранят JWT
для будущих вызовов API.