Если вы можете декодировать JWT, как они защищены?



Я люблю JWT,это действительно интересно работать. Мой вопрос: если я получаю JWT и могу декодировать полезную нагрузку, как это безопасно? Не могу ли я просто взять маркер из заголовка, декодировать и изменять информацию о пользователе в полезной нагрузке и отправить его обратно с тем же правильным закодированным секретом?



Я знаю, что они должны быть, мне просто очень нравится понимать технологии. Чего мне не хватает? Спасибо!

609   5  

5 ответов:

JWTs могут быть подписаны, зашифрованы или оба. Если маркер подписан, но не зашифрован, каждый может прочитать содержимое маркера, но если вы не знаете закрытый ключ, вы не можете его изменить. В противном случае получатель заметит, что подпись больше не будет совпадать.

ответ на ваш комментарий: Я не уверен, правильно ли я понимаю ваш комментарий. Просто чтобы быть уверенным: вы знаете и понимаете цифровые подписи? Я просто кратко объясню один вариант (HMAC, который является симметрично, но есть и много других).

предположим, что Алиса хочет отправить JWT Бобу. Они оба знают какой-то общий секрет. Мэллори не знает этого секрета, но хочет вмешаться и изменить JWT. Чтобы предотвратить это, Алиса вычисляет Hash(payload + secret) и добавляет Это как подпись.

при получении сообщения, Боб также может вычислить Hash(payload + secret) чтобы проверить, соответствует ли подпись. Если, однако, Мэллори что-то меняет в содержании, она не может вычислить соответствующая подпись (которая будет Hash(newContent + secret)). Она не знает секрет и не узнает. Это означает, что если она что-то изменит, подпись больше не будет совпадать, и Боб просто больше не примет JWT.

предположим, я посылаю другому человеку сообщение {"id":1} и подписать его с Hash(content + secret). (+- это просто конкатенация здесь). Я использую хэш-функцию SHA256, и подпись, которую я получаю:330e7b0775561c6e95797d4dd306a150046e239986f0a1373230fda0235bda8c. Теперь ваша очередь: играть роль Мэллори и попытаться подписать сообщение {"id":2}. Ты не можешь, потому что не знаешь, какой секрет я использовал. Если я предполагаю, что получатель знает секрет, он может вычислить подпись любого сообщения и проверить, правильно ли это.

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

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

логический вопрос заключается в том, что мотивация не касается себя с зашифрованным содержимым?

  1. самая простая причина заключается в том, что он предполагает, что это решенная проблема по большей части. Если вы имеете дело с клиентом, например, с веб-браузером, вы можете хранить токены JWT в файле cookie, который secure + httpsOnly (Не может быть прочитан Javascript + не может быть чтение по HTTP) и разговаривает с сервером по зашифрованному каналу (HTTPS). Как только вы узнаете, что у вас есть безопасный канал между сервером и клиентом, вы можете безопасно обмениваться JWT или чем-то еще.

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

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

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

содержимое веб-маркера json (JWT) не является по своей сути безопасным, но есть встроенная функция для проверки подлинности маркера. JWT - это три хэша, разделенные точками. Третье-это подпись. В системе с открытым/закрытым ключом издатель подписывает подпись токена закрытым ключом, который может быть проверен только соответствующим открытым ключом.

важно понимать различие между эмитентом и верификатора. Получатель токена несет ответственность для проверки этого.

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

читать: как открытый ключ проверяет подпись?

только privateKey JWT, который находится на вашем сервере, расшифрует зашифрованный JWT. Те, кто знает privateKey, смогут расшифровать зашифрованный JWT.

скрыть privateKey в безопасном месте на вашем сервере и никогда не говорите никому privateKey.

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

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

насколько мне известно, JWT не обеспечивает безопасность.

спасибо

Comments

    Ничего не найдено.