JSON Web Token (JWT)

Tink 支援產生及驗證 JWT,這是網路上廣為使用的標準。Tink 的 JWT 實作提供 RFC 7519 中定義的 JWT 標準子集,Tink 團隊認為這些標準可安全使用,且非常適合 Tink 程式庫。

Tink 不支援很少使用或難以正確使用的標準部分。限制如下:

  • Tink 僅支援 JWS Compact Serialization 格式。不支援 JWS JSON 序列化JWE
  • Tink 不支援 alg 標頭中的 None 值。
  • Tink 僅支援 typalgkid 標頭。系統不支援其他標頭。
  • Tink 不允許在驗證簽章或 MAC 之前剖析權杖。

JWT 簽章

如果權杖是由不同實體產生及驗證,您應搭配使用原始值 JwtPublicKeySignJwtPublicKeyVerify 的非對稱金鑰。私密金鑰用於產生權杖,公開金鑰則用於驗證權杖。這些基本體支援的演算法包括:ES256ES384ES512RS256RS384RS512PS256PS384PS512

選擇金鑰類型

JWT 簽章使用的金鑰類型與 Tink 中的一般數位簽章不同。這是因為部分中繼資料 (例如 algkid) 必須與金鑰一併儲存。

我們建議在多數情況下使用 JWT_ES256。使用這類金鑰產生的權杖一律會有 kid 標頭。如果偏好稍微短一點的權杖,且不需要 kid 標頭,請選擇 JWT_ES256_RAW 金鑰類型。如要查看所有支援的鍵類型,請參閱「支援的鍵類型」。

公開金鑰集發布

Tink 允許公開金鑰集轉換為 RFC 7517 中定義的 JWK 集格式,以及從該格式轉換,而大多數 JWT 程式庫都能理解這種格式。

Tink 不支援以任何其他格式匯出公開 JWT 金鑰。這是因為其他格式不含驗證時使用的 algkid 中繼資料,因此較容易發生錯誤,且可能難以輪替金鑰。

最好不要只分享一次公開金鑰集,而是提供自動更新公開金鑰集的方法。(否則很難輪替為新金鑰)。通常的做法是在受信任且安全的網址上發布公開金鑰集。驗證權杖的伺服器必須定期從該網址重新擷取公開金鑰集,例如每天一次。如要輪替金鑰,請至少提前一天將新公開金鑰新增至公開金鑰組,再用來簽署權杖。否則,伺服器仍會使用舊版公開金鑰集,因此會拒絕以新私密金鑰簽署的新權杖。

JWT MAC

Tink 也支援使用對稱式金鑰的 JWT,並提供 JwtMac 基本類型。只有在權杖是由同一實體產生及驗證時,才使用這個基本類型。這項基本功能支援的演算法HS256HS384HS512

選擇金鑰類型

JWT MAC 金鑰類型與一般 MAC 金鑰類型不同。我們建議在多數情況下使用 JWT_HS256

使用範例

請參閱「我想建立及驗證 JWT」。