Think 时事通讯
您的团队能否及时捕获下一个零日?
加入安全领导者的行列,订阅 Think 时事通讯,获取有关 AI、网络安全、数据和自动化的精选资讯。快速访问专家教程和阅读解释器,我们会将这些内容直接发送到您的收件箱。请参阅 IBM 隐私声明。
我不记得第一次见到 JSON Web Token (JWT) 是什么时候,但从那以后,我见过很多。对于没有经验的人来说,它们看起来像是一段乱码的计算机输出:
实际上,上述内容(以及 JWT 本身)包含了关键信息,这些信息直接影响云端和本地环境的安全性。它用于识别和验证用户。JWT 对基于微服务的解决方案的运行至关重要,也是实现 12-factor 应用的重要构建模块。
在这篇博客文章中,我将分享 JWT 背后的一些历史,介绍它们的基本概念,并探讨 IBM Cloud 上的常见 JWT 使用场景。
Think 时事通讯
加入安全领导者的行列,订阅 Think 时事通讯,获取有关 AI、网络安全、数据和自动化的精选资讯。快速访问专家教程和阅读解释器,我们会将这些内容直接发送到您的收件箱。请参阅 IBM 隐私声明。
JSON Web Token 的首个草案 已经有 10 多年的历史(发布于 2010 年 12 月)。早期草案中指出:“JSON Web Token (JWT) 定义了一种令牌格式,可对在双方之间传输的声明进行编码。JWT 中的声明以 JSON 对象的形式编码,并经过数字签名。”
在其最新版本 IETF RFC 7519 中,定义扩展如下:“JSON Web Token(JWT)是一种紧凑的、URL 安全的方式,用于在两个实体之间传递声明。JWT 中的声明被编码为 JSON 对象,该对象可用作 JSON Web Signature (JWS) 结构的负载,或作为 JSON Web Encryption (JWE) 结构的明文,从而使声明可以被数字签名或通过消息认证码 (MAC) 进行完整性保护和/或加密。”
新的描述暗示了 JWT(通常发音为“jot”)的两种表示形式,即 JSON Web 签名 (JWS) 或 JSON Web 加密 (JWE) 结构。JWS 在 RFC 7515 中被定义,JWE 在 RFC 7516 中被定义。甚至还有更多相关的基于 JSON 的安全标准,它们都是由一个名为 JOSE(JSON 对象签名和加密)的工作组定义的。
OAuth 2.0 是行业授权标准。无需赘述,它提供了一个授权流程和核心概念,包括所谓的访问令牌和刷新令牌。虽然并不要求使用 JWT,但如今 JWT 已成为常用工具。如前所述,OAuth 的重点是授权,有时也被滥用于处理身份识别。OpenID Connect 增加了这块缺失的拼图,引入了身份或 ID 令牌。ID 令牌以 JWT 的形式表示。
有了这段历史和一些标准作为基础,我们如何从上至下处理 JWT,它又包含哪些信息?
上述 JWT 由三个部分组成,每个部分用点(“.”)隔开:
标头和有效负载都是 base64url 编码的,在不考虑可能的填充的情况下,可以解码如下:
henrik@home> base64 -d <<< eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
{"alg":"HS256","typ":"JWT"}
henrik@home> base64 -d <<< eyJzdWIiOiIxMjM0NTY3ODkwQUJDIiwibmFtZSI6IkhlbnJpayBMb2VzZXIiLCJpYXQiOjE2MTExNDA0MDAsImV4cCI6MTYxMTIzNDU2N30
{"sub":"1234567890ABC","name":"Henrik Loeser","iat":1611140400,"exp":1611234567}base64: invalid input
标头包含所使用算法的相关信息 — 本例是 HS256 (HMAC SHA256)。有效负载取决于(访问/刷新/ID/…)令牌的类型,由声明组成。这些和其他预定义的 JOSE 标头和有效负载字段由 IANA 管理。在上面的示例中,字段和声明分别是:subj(ect)、name、issued at (iat) 和 exp(iration time)。
签名是通过将所述算法应用于标头、‘.’ 和有效负载的连接,然后对结果进行 base64url 编码来计算的。此后,用点分隔的三个部分构成了 JWT。RFC 7515 中定义了如何派生签名的详细信息。
您可以在 JTW.io 的此在线调试器中访问上述 JWT。首先,它会显示一条“无效签名“消息。您可以通过将显示的默认密钥替换为 !!!my-really-big-256-bit-secret!!! 来解决此问题。
由于 IBM Cloud 在其服务目录中提供了众多服务,同时自身又是一个包含许多组件的互联网应用,因此它广泛使用令牌,包括 JWT。您可能已经使用过 IBM Cloud 命令行界面 (CLI) 及其命令 ibmcloud iam oauth-tokens:
它会显示当前 CLI 会话的 OAuth 承载令牌(访问令牌),这些令牌是以 JWT 实现的。这些 IAM 令牌用于访问启用 IAM 的云服务。
如果您想将外部用户集成到您的云账户中,那么也可以使用 JWT。身份令牌及其包含的声明用于身份验证,以识别用户身份。许多解决方案都利用了 IBM Cloud App ID 安全服务。它有助于验证用户身份并保护资源。它利用了上述 OAuth 2.0 和 OpenID Connect 标准,因此可以处理访问、ID 和刷新令牌。
我(和你)最喜欢的服务之一是 watsonx Assistant,可用于构建聊天机器人。如果您想保护网络聊天(即进一步保护交换的消息并证明消息来源),JWT 可以派上用场。
当然,JWT 还可以用来轻松交换(安全)声明,从而加强云解决方案的安全性,这样的示例还有很多。
JWT 是在双方之间交换请求的一种简单、自足的方式。它们是一种普遍存在的数据结构,无论是在云还是在本地部署中。希望以上内容能起到一定的介绍作用,引起您的兴趣(如果您之前还没有兴趣的话)。
如果您想自己检查和修补 JWT,我推荐您使用 https://jwt.io/ 这样的在线工具。如果您想深入了解,可以使用网络监控或浏览器中的开发者工具来监视 JWT。欢迎浏览我们的 IBM Cloud 教程,其中包含许多与安全性相关的教程。
如果您对这篇文章有反馈、建议或问题,请在 Twitter (@data_henrik) 或 LinkedIn 上与我联系。