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 的 JWT

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

選擇車鑰類型

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