JSON Web Token (JWT)

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

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

  • Tink 僅支援 JWS 精簡序列化格式。不支援 JWS JSON 序列化JWE
  • Tink 不支援 alg 標頭中的 None 值。
  • Tink 僅支援 typalgkid 標頭。系統不支援所有其他標頭。
  • Tink 不允許在驗證簽章或 MAC 前剖析符記。

JWT 簽章

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

選擇金鑰類型

與 Tink 中的一般數位簽章相比,JWT 簽名使用的金鑰類型「不同」。由於某些中繼資料 (例如 algkid) 需要與鍵一起儲存,因此需要這麼做。

大多數用途都建議使用 JWT_ES256。使用此金鑰類型產生的權杖一律會有 kid 標頭。如果您希望在沒有 kid 標頭的情況下稍微縮短符記,請選擇鍵類型 JWT_ES256_RAW。如需所有支援的金鑰類型,請參閱支援的金鑰類型

公開金鑰發布

Tink 允許將公開金鑰轉換成 RFC 7517 中定義的 JWK Sets 格式,這也是多數 JWT 程式庫能夠解讀的 JWK Sets 格式。

Tink 不支援以任何其他格式匯出公開 JWT 金鑰。這是因為其他格式不含 algkid 中繼資料 (用於驗證),因此使用起來較容易出錯,且更難以輪替金鑰。

建議您不要隻共用一次公開金鑰,而是提供自動更新公開金鑰集的方式。(如果不允許,輪替新金鑰非常困難)。通常就是將公開金鑰發布到受信任且安全的網址。接著,驗證權杖的伺服器只需要定期從該網址重新擷取公開金鑰,例如每天一次。如要輪替金鑰,您至少要過一天,才能將新的公開金鑰新增至公開金鑰集以簽署權杖。否則,使用舊版公開金鑰集的伺服器會拒絕使用新私密金鑰簽署的新憑證。

JWT MAC

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

選擇金鑰類型

JWT MAC 金鑰類型與一般 MAC 金鑰類型「不同」。大多數用途都建議使用 JWT_HS256