Tink поддерживает генерацию и проверку JWT, которые являются широко используемым стандартом в интернете. Реализация JWT в Tink представляет собой подмножество стандарта JWT, определённого в RFC 7519, которое команда Tink считает безопасным для использования и которое хорошо вписывается в библиотеку Tink.
Tink не поддерживает те части стандарта, которые используются редко или сложно использовать корректно. Вот ограничения:
- Tink поддерживает только формат JWS Compact Serialization . JWS JSON Serialization и 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 Sets, определенный в RFC 7517 , который понимают большинство библиотек JWT.
Tink не поддерживает экспорт открытых JWT-ключей в других форматах. Причина в том, что другие форматы не содержат метаданных alg
и kid
, необходимых для проверки, что повышает вероятность ошибок при их использовании и может затруднить ротацию ключей.
Предпочтительно не просто предоставить общий доступ к набору открытых ключей один раз, а обеспечить возможность его автоматического обновления. (В противном случае переход на новый ключ будет очень затруднён.) Часто это достигается путём публикации набора открытых ключей на доверенном и защищённом URL-адресе. Сервер, проверяющий токены, должен периодически повторно загружать набор открытых ключей с этого URL-адреса, например, раз в день. Для ротации ключа новый открытый ключ необходимо добавить в набор открытых ключей как минимум за один день до того, как он будет использован для подписи токенов. В противном случае новые токены, подписанные новым закрытым ключом, будут отклонены серверами, которые всё ещё используют старый набор открытых ключей.
JWT MAC
Tink также поддерживает JWT с симметричными ключами с помощью примитива JwtMac
. Используйте этот примитив только в том случае, если токены генерируются и верифицируются одной и той же сущностью. Этот примитив поддерживает алгоритмы HS256
, HS384
и HS512
.
Выберите тип ключа
Типы ключей JWT MAC отличаются от обычных типов ключей MAC. Для большинства случаев мы рекомендуем использовать JWT_HS256
.