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

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 .

Примеры использования

См. Я хочу создать и проверить JWT .