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
для большинства случаев использования.