Что такое секретный ключ в JWT - PullRequest
0 голосов
/ 14 мая 2018

Я не могу четко понять, как работает JWT, особенно часть подписи.

Как только клиент отправляет правильное имя пользователя и пароль, сервер аутентификации создает токен JWT, состоящий из заголовка, полезной нагрузки / утверждений и подписи.

Вопрос 1 - Является ли подпись каким-то секретным ключом (не паролем пользователя), который знает только сервер аутентификации (своего рода закрытый ключ сервера)?

Вопрос 2. Скажем, я использую отдельный сервер приложений и сервер аутентификации при получении JWT от клиента. Будет ли сервер приложений отправлять JWT на сервер аутентификации для его проверки? Я полагаю, что сервер приложений не может проверить токен JWT, поскольку он не знает секретный ключ, используемый для подписи заголовка и полезной нагрузки.

Вопрос 3 - Я взял следующий JWT и вставил его в jwt.io. Я вижу сообщение Signature Verified. Как jwt.io узнает, что подпись верна, поскольку не знает секретного ключа.

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxLS9tSjVsVTNYc09QWCt2VitpaGZRMWlCUDVjUTROQm1hNDluOE9rS1FFSnEzTDFNOTl2VW9iQ1ZLUHVYMmdlWWhYaHJQM0t3bHY4SE1RaHNGdnFjbllIeGxGSHM9IiwiaXNzIjoicGxheS1zaWxob3VldHRlIiwiZXhwIjoxNTI2MjgxMDU1LCJpYXQiOjE1MjYyMzc4NTUsImp0aSI6IjhmOGM3YTVmYWRkNTE5MjUxNzQ5NGE4N2Q1ODcxZjJjZGUxZDkzMDdkOTY1MThjNjg2NzExOTc1YjU3M2I5NDBlZWU2NGY0NDUwYzcxODI3NGZmNzU1MmE2Y2JlNTVmZmZhMWI1ZjA3ZWZlOWVkNTE0Y2Y4YTViOTZlM2ExYjI0ODRmYTI5NjZiYjA0ODlmODIwZjMyMzM5YWVhNjM3NWRkZmU4ZDE4N2E2NzBjMzg0ODgwZGIyMzQ1ZTFkMzRkYWNjZmY2MTdkMDY1NzU3YmEwZTQzNDg4YWFhZmZmNDNjYWZlZGY0OTFlODU1YTA0NWM0NmJjNDY4NGYzODlmY2YifQ.GwN6TSNd426xpc3Y02eRXHbrmSr_61MMBqrmx66Ofqs

enter image description here

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Подпись - это просто хэширование с использованием секретного ключа, сгенерированного сервером аутентификации , с использованием алгоритма, указанного в заголовке, комбинации вашего заголовка, полезной нагрузки и секрета

Только секретный сервер и / или сервер приложений знает этот секрет. JWT кодируется и подписывается, но не шифруется. Чтобы понять разницу между знаком / хэшем и шифрованием, отметьте this

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

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

Чтобы понять, как это работает в аутентификации, вот поток:

  • Пользователь вошел в систему, вы отправили пользователя / пароль на сервер в зашифрованном виде через https
  • Сервер проверяет имя пользователя / пароль от вашей базы данных
  • Сервер генерирует JWT и отправляет его обратно вам. Подпись используется здесь для проверки того, что сообщение не было изменено.
  • Сервер сохраняет JWT где-то в хранилище сеансов.
  • Позже пользователь запрашивает сервер (отправляет JWT каждый раз, когда ему что-то нужно с сервера)
  • Сервер проверяет его, используя тот же тип алгоритма хеширования, который находится в заголовке, и в нем хранится секрет.
  • Сервер проверяет, находится ли он уже в хранилище сеансов.
  • Серверы авторизуют и предоставляют вам запрос.

Я бы рекомендовал вам прочитать эту статью , которая более наглядна, чтобы лучше понять, как она работает.

0 голосов
/ 14 мая 2018

Вопрос 1 - Является ли подпись каким-то секретным ключом (не паролем пользователя), который знает только сервер аутентификации (своего рода закрытый ключ сервера)?

Нет, электронныйподпись - это математическое вычисление, применяемое к полезной нагрузке JWT с использованием секретного ключа.Цель состоит в том, чтобы убедиться, что сообщение не было изменено, и распознать подписавшего, чтобы проверить JWT

Вопрос 2. Скажите, что я использую отдельный сервер приложений и сервер аутентификации при получении JWT от клиентаБудет ли сервер приложений отправлять JWT на сервер аутентификации для его проверки?Я полагаю, что сервер приложений не может проверить токен JWT, поскольку он не знает секретный ключ, используемый для подписи заголовка и полезной нагрузки.

Не обязательно.Если используется симметричный ключ (HMAC), подпись и ключ проверки совпадают.В этом случае сервер авторизации должен знать секретный ключ или отправить токен для проверки.Однако если используется асимметричный ключ (RSA, ECDSA), ключ подписи отличается от ключа проверки.Сервер авторизации может безопасно хранить копию открытого ключа

Вопрос 3 - Я взял следующий JWT и вставил его в jwt.io.Я вижу сообщение Подпись проверена.Как jwt.io узнает, что подпись верна, поскольку не знает секретного ключа.

jwt.io или любому, кто хочет проверить токен, нужен секретный ключ.Обратите внимание, что если вы копируете и вставляете токен в jwt.io, подпись не проверяется, но если вы меняете секретный ключ, редактор автоматически меняет подпись, создавая новый токен во время

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...