Рубрики
Uncategorized

Я покажу вам принцип JWT.

Автор оригинала: David Wong.

Веб-токен JSON (JWT) – это очень легкая спецификация. Эта спецификация позволяет нам использовать JWT для передачи безопасной и надежной информации между пользователями и серверами.

Давайте представим себе сцену. Когда пользователь а обращает внимание на пользователя В, система отправляет электронное письмо пользователю В со ссылкой “обратите внимание на пользователя а, нажав здесь”. Адрес ссылки может быть

Приведенный выше URL-адрес в основном описывает это по URL-адресу. Конечно, в этом есть и недостаток. То есть пользователь B должен сначала войти в систему. Можете ли вы упростить этот процесс, чтобы пользователь B мог выполнить эту операцию без входа в систему? JWT позволяет нам это делать.

Состав JWT

JWT на самом деле представляет собой строку, которая состоит из трех частей. голованагрузка И автограф

{

​ “iss”: “Джон Ву JWT”,

​ “iat”: 1441593502,

​ “exp”: 1441594722,

​ “ауд”: “www.example.com,

​ “sub”: “[электронная почта защищена] “,

​ “от_пользователя”: “B”,

​ “target_user”: “A”

}

Первые пять полей определены стандартами JWT.

  • ISS: эмитент JWT
  • Sub: пользователь, для которого предназначен JWT
  • Aud: сторона, получающая JWT
  • Exp (истекает): когда он истекает? Вот временная метка UNIX
  • IAT (выдан в): когда он был выдан

Эти определения можно найти в стандарте.

Вы можете получить следующую строку с помощью [кодировка Base64] объекта JSON выше. Эту строку мы называем JWT Полезная нагрузка (загрузка).

eyJpc3MiOiJKb2huIFd1IEpXVCIsImlhdCI6MTQ0MTU5MzUwMiwiZXhwIjoxNDQxNTk0NzIyLCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJqcm9ja2V0QGV4YW1wbGUuY29tIiwiZnJvbV91c2VyIjoiQiIsInRhcmdldF91c2VyIjoiQSJ9

Примечание: Base64-это кодировка, которая может быть переведена обратно в исходную форму. Это не процесс шифрования.

Глава

JWT также необходим заголовок, который используется для описания самой основной информации о JWT, такой как его тип и алгоритм, используемый для подписи. Это также может быть представлено в виде объекта JSON.

{

“тип”: “JWT”,

“alg”: “HS256”

}

Здесь мы покажем, что это JWT, а наш алгоритм подписи (упомянутый позже) – алгоритм hs256.

Он также должен быть закодирован в Base64, после чего строка становится заголовком JWT |/(head).

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
Подпись (подпись)

Используйте точку для соединения двух закодированных строк выше (заголовок находится перед строкой), чтобы сформировать

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0

Наконец, давайте возьмем строку, которую мы соединили выше.( $ввод )С использованием алгоритма hs256( $algo )Шифрования. При шифровании нам также необходимо предоставить ключ ($secret). Например, если мы используем строку mysecret в качестве ключа, мы можем получить зашифрованное содержимое в качестве подписи JWT с помощью следующих методов:

hash_hmac($algo, $input, $secret);// output: rSWamyAYwuHCo7IFAgd1oRpùSP7nzL7BF5t7ItqpKViM

Наконец, эта часть подписи соединяется за подписанной строкой, и мы получаем полный JWT:

Наконец, эта часть подписи соединяется за подписанной строкой, и мы получаем полный JWT:

Таким образом, мы можем изменить URL-адрес в электронном письме на

Таким образом, мы можем изменить URL-адрес в электронном письме на

Таким образом, после того, как сервер проверит подпись JWT, он может завершить операцию добавления пользователя a в качестве друга пользователя B, не требуя от пользователя повторного входа в систему.

У вас должно возникнуть два вопроса, когда вы это увидите.

  1. Какова цель подписи?
  2. Base64-это своего рода код, который является обратимым. Разве моя информация не раскрыта?

Цель подписи

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

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

После получения JWT серверное приложение сначала подпишет содержимое заголовка и загрузится по тому же алгоритму. Итак, как серверные приложения узнают, какой алгоритм мы используем? Не забывайте, что мы указали наш алгоритм шифрования с помощью поля alg в заголовке JWT.

Если серверное приложение снова подписывает заголовок и полезную нагрузку таким же образом и обнаруживает, что подпись, вычисленная сама по себе, не совпадает с полученной подписью, это означает, что содержимое токена было перемещено кем-то другим. Мы должны отклонить токен и вернуть несанкционированный ответ HTTP 401.

О рекомендуемых встроенных функциях в PHP для двух подписей hash_equals , Чтобы помочь нам закончить это

hash_equals ( строка $known_string , строка $user_string ): bool

Сравнивая две строки, независимо от того, равны они или нет, время, затрачиваемое этой функцией, остается постоянным.

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

Информация будет раскрыта

Загрузка JWT и информация в заголовке могут быть декодированы с помощью Base64, поэтому в JWT к загрузке не следует добавлять конфиденциальные данные. В приведенном выше примере мы передаем идентификатор пользователя пользователя. Это значение на самом деле не является конфиденциальным контентом, и, как правило, известно, что оно безопасно. Содержимое, такое как пароли, не может быть размещено в JWT. Если пароль пользователя введен в JWT, вредоносная третья сторона может быстро узнать ваш пароль с помощью декодирования Base64.

Применимые сценарии JWT

Как мы видим, JWT подходит для передачи некоторой конфиденциальной информации веб-приложениям. Например, операция добавления друзей, упомянутая выше, и

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

До этого я написал очень простую программу для генерации и проверки JWT на PHP, которую можно использовать для справки. Код был введен в суть на https://gist.github.com/kevin….