фальсификация действительного токена JWT

После успешного входа приложение моего узла возвращает токен JWT.

JWT подписан с идентификатором пользователя, датой истечения срока действия и секретом.

Вот как бы я сгенерировал токен для пользователя с id: 1:

    return jwt.sign({
        _id: 1,
        exp: exp_date),
    }, "MY_SECRET"); 
    };

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

Может ли пользователь с «id: 1» отредактировать свой действительный токен, установить его с «id: 2», а затем начать дурачиться во внутреннем приложении, как если бы он был пользователем с «id: 2»?


person Lev    schedule 01.10.2016    source источник


Ответы (2)


Нет, если кто-то не получил доступ к вашему закрытому ключу, который вы используете для подписи JSON.

person idbehold    schedule 01.10.2016

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

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

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

person Andreas Jägle    schedule 01.10.2016