Веб-токены 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 .

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

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

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

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

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

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

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

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

Видите ли, я хочу создавать и проверять JWT-токены с помощью подписей .

JWT с MAC-адресами

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

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

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