Tink 支持生成和验证 JWT,后者是网络上广泛使用的标准。Tink 的 JWT 实现提供了 RFC 7519 中定义的 JWT 标准子集,Tink 团队认为该标准可安全使用,并且非常适合 Tink 库。
Tink 不支持该标准中很少使用或难以正确使用的部分。以下是限制:
- Tink 仅支持 JWS 紧凑序列化格式。不支持 JWS JSON 序列化和 JWE。
- Tink 不支持
alg
标头中的None
值。 - Tink 仅支持头文件
typ
、alg
和kid
。所有其他标头均不受支持。 - Tink 不允许在验证签名或 MAC 之前解析令牌。
JWT 签名
如果令牌由不同的实体生成和验证,则应使用具有基元 JwtPublicKeySign
和 JwtPublicKeyVerify
的非对称密钥。私钥用于生成令牌,公钥用于验证令牌。这些基元支持的算法包括:ES256
、ES384
、ES512
、RS256
、RS384
、RS512
、PS256
、PS384
和 PS512
。
选择密钥类型
JWT 签名使用的密钥类型与 Tink 中的常规数字签名不同。之所以需要这一点,是因为某些元数据(例如 alg
和 kid
)需要随键一起存储。
对于大多数用例,我们建议使用 JWT_ES256
。使用此密钥类型生成的令牌始终具有 kid
标头。如果您希望不带 kid
标头的令牌长度稍短一些,请选择密钥类型 JWT_ES256_RAW
。如需了解所有支持的密钥类型,请参阅支持的密钥类型。
公钥集分发
Tink 允许将公钥集与 RFC 7517 中定义的 JWK Set 格式相互转换,大多数 JWT 库都支持该格式。
Tink 不支持以任何其他格式导出 JWT 公钥。这是因为其他格式不包含要在验证中使用的 alg
和 kid
元数据,这使得它们更容易出错,并且可能导致密钥轮替更加困难。
最好不仅共享公钥集一次,而且最好提供一种自动更新公钥集的方法。(如果没有,轮替到新密钥将非常困难。)这通常通过在可信且安全的网址上发布公钥集来实现。然后,验证令牌的服务器只需定期从该网址重新获取公钥集,例如每天一次。如需轮替密钥,您需要在使用新公钥对令牌签名至少一天前将新公钥添加到公钥集。否则,仍使用旧公钥集的服务器会拒绝使用新私钥签署的新令牌。
JWT MAC
Tink 还支持具有具有基元 JwtMac
的对称密钥的 JWT。仅当令牌是由同一实体生成和验证时,才使用此基元。此基元支持的算法包括 HS256
、HS384
和 HS512
。
选择密钥类型
JWT MAC 密钥类型与普通 MAC 密钥类型不同。对于大多数用例,我们建议使用 JWT_HS256
。