JSON Web 令牌 (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

选择密钥类型

JWT 签名使用的密钥类型与 Tink 中的常规数字签名不同。之所以需要这一点,是因为某些元数据(例如 algkid)需要随键一起存储。

对于大多数用例,我们建议使用 JWT_ES256。使用此密钥类型生成的令牌始终具有 kid 标头。如果您希望不带 kid 标头的令牌长度稍短一些,请选择密钥类型 JWT_ES256_RAW。如需了解所有支持的密钥类型,请参阅支持的密钥类型

公钥集分发

Tink 允许将公钥集与 RFC 7517 中定义的 JWK Set 格式相互转换,大多数 JWT 库都支持该格式。

Tink 不支持以任何其他格式导出 JWT 公钥。这是因为其他格式不包含要在验证中使用的 algkid 元数据,这使得它们更容易出错,并且可能导致密钥轮替更加困难。

最好不仅共享公钥集一次,而且最好提供一种自动更新公钥集的方法。(如果没有,轮替到新密钥将非常困难。)这通常通过在可信且安全的网址上发布公钥集来实现。然后,验证令牌的服务器只需定期从该网址重新获取公钥集,例如每天一次。如需轮替密钥,您需要在使用新公钥对令牌签名至少一天前将新公钥添加到公钥集。否则,仍使用旧公钥集的服务器会拒绝使用新私钥签署的新令牌。

JWT MAC

Tink 还支持具有具有基元 JwtMac 的对称密钥的 JWT。仅当令牌是由同一实体生成和验证时,才使用此基元。此基元支持的算法包括 HS256HS384HS512

选择密钥类型

JWT MAC 密钥类型与普通 MAC 密钥类型不同。对于大多数用例,我们建议使用 JWT_HS256