JSON Web 令牌 (JWT)

Tink 支持生成和验证 JWT,这是 Web 上广泛使用的标准。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 集格式,大多数 JWT 库都支持这种格式。

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

最好不要只共享一次公钥集,而是提供一种自动更新公钥集的方法。(否则,很难轮替到新密钥。)这通常通过在可信且安全的网址上发布公开密钥集来完成。然后,验证令牌的服务器必须定期(例如每天一次)从该网址重新获取公钥集。如需轮替密钥,需要至少提前一天将新公钥添加到公钥集中,然后才能使用该公钥为令牌签名。否则,仍在使用旧公钥集的服务器会拒绝使用新私钥签名的新令牌。

JWT MAC

Tink 还支持使用基元 JwtMac 的对称密钥进行 JWT 处理。仅当令牌由同一实体生成和验证时,才使用此原语。此原语支持的算法HS256HS384HS512

选择密钥类型

JWT MAC 密钥类型与常规 MAC 密钥类型不同。对于大多数使用场景,建议使用 JWT_HS256

应用场景示例

请参阅我想创建和验证 JWT