Веб-токены JSON (JWT)

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

Tink не поддерживает части стандарта, которые редко используются или которые сложно использовать правильно. Вот ограничения:

  • Tink поддерживает только формат JWS Compact Serialization . JWS Сериализация JSON и JWE не поддерживаются.
  • Tink не поддерживает значение None в заголовке alg .
  • Tink поддерживает только заголовки typ , alg и kid . Все остальные заголовки не поддерживаются.
  • Tink не позволяет анализировать токены до проверки подписи или MAC.

JWT-подписи

Если токены генерируются и проверяются разными объектами, вам следует использовать асимметричные ключи с примитивами JwtPublicKeySign и JwtPublicKeyVerify . Закрытый ключ используется для генерации токенов, а открытый ключ используется для проверки токенов. Алгоритмы, поддерживаемые этими примитивами: ES256 , ES384 , ES512 , RS256 , RS384 , RS512 , PS256 , PS384 и PS512 .

Выбор типа ключа

В подписях JWT используются разные типы ключей, чем в обычной цифровой подписи в Tink. Это необходимо, поскольку некоторые метаданные (например, alg и kid ) необходимо хранить вместе с ключом.

Мы рекомендуем использовать JWT_ES256 для большинства случаев использования. Токены, созданные с помощью этого типа ключа, всегда имеют kid заголовок. Если вы предпочитаете более короткие токены без kid заголовка, выберите тип ключа JWT_ES256_RAW . Сведения обо всех поддерживаемых типах ключей см. в разделе Поддерживаемые типы ключей .

Распространение открытого набора ключей

Tink позволяет конвертировать открытый набор ключей в формат наборов JWK, определенный в RFC 7517 , который понимает большинство библиотек JWT, и обратно.

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

Предпочтительно не просто предоставить общий доступ к набору открытых ключей один раз, но и предоставить возможность автоматического обновления набора открытых ключей. (Если нет, перейти на новый ключ очень сложно.) Это часто делается путем публикации открытого набора ключей на надежном и защищенном URL-адресе. Сервер, который проверяет токены, затем просто должен периодически повторно получать набор открытых ключей с этого URL-адреса, например, один раз в день. Для ротации ключа новый открытый ключ необходимо добавить в набор открытых ключей как минимум за один день до того, как он будет использоваться для подписи токенов. В противном случае новые токены, подписанные новым закрытым ключом, будут отклонены серверами, которые все еще используют старый набор открытых ключей.

JWT MAC

Tink также поддерживает JWT с симметричными ключами с помощью примитива JwtMac . Используйте этот примитив только в том случае, если токены генерируются и проверяются одним и тем же объектом. Алгоритмы, поддерживаемые этим примитивом, — HS256 , HS384 и HS512 .

Выбор типа ключа

Типы ключей MAC JWT отличаются от обычных типов ключей MAC. Мы рекомендуем использовать JWT_HS256 для большинства случаев использования.