2014-02-04 3 views
7

Я использую JWT, чтобы производить и потреблять токены. После недель чтения спецификаций и googling я все еще не понимаю: что защищено от токена, если я могу создать его на одной машине, а затем открыть его на другой? Предполагается ли, что написанный токен зашифрован? Я использую System.IdentityModel.Tokens и создаю токен, используя JwtSecurityToken и JwtSecurityTokenHandler.Что защищено от JWT?

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

ответ

4

Из того, что я могу сказать, реализация C# JwtSecurityToken не предназначена для шифрования его содержимого (как кажется, кажется, ваш вопрос). Вместо этого он предназначен для подписи своего содержимого. Это соответствует типичной модели безопасности токена. Предполагается, что это часть информации, которая в противном случае защищена.

Различие заключается в том, что вы не пытаетесь скрыть какую-либо информацию, вы просто проверяете источник информации (а также целостность, но это связано).

Например, Twitter может дать вам токен с данными «eddyuk», «потрясающее приложение eddyuk» и считать достаточным для авторизации. Чтобы избежать того, чтобы я сделал свой собственный токен с той же целью, они могут его подписать, поэтому для использования требуется точная копия оригинального токена.

Это служит двум целям: вам не нужно управлять сложной схемой отображения, и если ваш метод подписи безопасен, угадать невозможно.

Обратите внимание, что существует способ хранения зашифрованной информации в токене с использованием некоторых других реализаций, но C# 1 не поддерживает эту функциональность.

+1

Ваш стартовый оператор «JwtSecurityToken не предназначен для шифрования его содержимого» является ложным. JWT включает как подписанные (JWS), так и зашифрованные токены (JWE). Обновите свой ответ. –

+1

@ ZólyomiIstván: Я не могу найти ничего, что говорит о том, что JwtSecurityToken может выполнять шифрование на своем содержимом. Если вы хотите указать такую ​​информацию, я обновлю свой ответ. – Guvante

+0

Ах, ты прав. Я говорил о JWT вообще, но забыл о теге C#. Я готов удалить свой downvote, но теперь мой голос заблокирован системой до тех пор, пока не будет отредактирован ответ. –

22

Первые два сегмента JWT не зашифрованы, поэтому любое приложение, которое генерирует JWT на сервере и отправляет его обратно клиенту, должно делать это через SSL. Обычно это отправляется пользователю в ответ на запрос входа в систему, который должен быть отправлен по SSL в любом случае, поскольку он обычно содержит комбинацию имени пользователя и пароля. Последующие запросы, отправленные на сервер, также должны выполняться через SSL, потому что независимо от того, какой маркер вы используете - будь то JWT или что-то еще - он не должен быть видимым в незашифрованной форме для обнюхивания пакетов, иначе пользовательские сессии могут быть захвачены.

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

+0

+1, краткий и ясный ответ, спасибо :) –

+0

Добро пожаловать. –

+0

@SteveTaylor я, наконец, получил это, я думаю – FutuToad

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