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 .