2016-07-21 5 views
1

Мое приложение использует JWT и должно предотвращать повторные атаки. Я тестировал это, столкнулся с следующим.Почему подпись JWT не уникальна для конкретной полезной нагрузки

Когда у меня есть действующий JWT и измените последний символ токена/подписи, JWT остается в силе. Например. следующая лексема делать все проверки правильности: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJTb21lIFRlc3QiLCJjbGFpbSI6IlNvbWUgQ2xhaW0ifQ.UkFYSK7hSSeiqUOSMdbXgbOErMFnuK0Emk1722ny-r4 eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJTb21lIFRlc3QiLCJjbGFpbSI6IlNvbWUgQ2xhaW0ifQ.UkFYSK7hSSeiqUOSMdbXgbOErMFnuK0Emk1722ny-r5 eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJTb21lIFRlc3QiLCJjbGFpbSI6IlNvbWUgQ2xhaW0ifQ.UkFYSK7hSSeiqUOSMdbXgbOErMFnuK0Emk1722ny-r6 eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJTb21lIFRlc3QiLCJjbGFpbSI6IlNvbWUgQ2xhaW0ifQ.UkFYSK7hSSeiqUOSMdbXgbOErMFnuK0Emk1722ny-r7

Я проверил это на http://jwt.io/ и могу быть воспроизведен в моем .Net приложении, а также.

Может кто-нибудь объяснить, как возможно, что подпись не уникальна для данной полезной нагрузки? Я понимаю, что могут произойти столкновения, но я не могу объяснить, что они являются последовательными последовательностями.

ответ

2

В этом частном случае вы меняете base64 кодирование URL-адрес подписи, а не сам

подпись Четвертые значения base64 кодирования же двоичное значение. Попробуйте преобразовать в шестнадцатеричное в http://kjur.github.io/jsjws/tool_b64udec.html

Значение вы видите

52415848aee14927a2a9439231d6d781b384acc167b8ad049a4d7bdb69f2fabe 

Если вы измените суффикс -r1 или -r8 то двоичные изменения значений и проверка подписи потерпит неудачу

Can two different BASE 64 encoded strings result into same string if decoded?

-1

Когда вы меняете подпись (последняя часть), вы все равно можете декодировать JWT, чтобы увидеть заголовок и полезную нагрузку. Однако, если вы попытаетесь проверить JWT с измененной подписью, эта проверка не удастся.

+0

Это неправда. Потому что вы меняете _signature_. Сама подпись, очевидно, не является частью самой подписи. Таким образом, вы можете изменить подпись и иметь действительное сообщение. Вот об этом и весь этот вопрос. По-видимому, это связано с тем, как ведет себя base64. Это означает, что у вас есть другой токен с точно такой же полезной нагрузкой с разными сигнатурами, но все они действительны. –

+0

Я не понимаю, что «у вас все еще есть правильное сообщение». Да, вы все еще можете «декодировать» JwtHeader и JwtPayload, но процесс проверки JWT требует, чтобы «подпись» соответствовала JwtHeader и JwtPayload. Так что нет, JWT не будет считаться действительным, и библиотеки должны его отклонить. –

Смежные вопросы