JSON Web 令牌作为云安全的构建块

作者

Henrik Loeser

Technical Offering Manager / Developer Advocate

了解如何声明自己的身份。

我不记得第一次见到 JSON Web Token (JWT) 是什么时候,但从那以后,我见过很多。对于没有经验的人来说,它们看起来像是一段乱码的计算机输出:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwQUJDIiwibmFtZSI6IkhlbnJpayBMb2VzZXIiLCJpYXQiOjE2MTExNDA0MDAsImV4cCI6MTYxMTIzNDU2N30._iVbBcypdse-9sjrxp9iOrGsXKBWrBB3mrHgBtukcfM

实际上,上述内容(以及 JWT 本身)包含了关键信息,这些信息直接影响云端和本地环境的安全性。它用于识别和验证用户。JWT 对基于微服务的解决方案的运行至关重要,也是实现 12-factor 应用的重要构建模块。

在这篇博客文章中,我将分享 JWT 背后的一些历史,介绍它们的基本概念,并探讨 IBM Cloud 上的常见 JWT 使用场景。

 

您的团队能否及时捕获下一个零日?

加入安全领导者的行列,订阅 Think 时事通讯,获取有关 AI、网络安全、数据和自动化的精选资讯。快速访问专家教程和阅读解释器,我们会将这些内容直接发送到您的收件箱。请参阅 IBM 隐私声明

您的订阅将以英语提供。每份时事通讯都包含取消订阅链接。您可以在此处管理订阅或取消订阅。更多相关信息,请参阅我们的 IBM 隐私声明

https://www.ibm.com/cn-zh/privacy

JWT 的一些历史背景

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,它又包含哪些信息?

上述 JWT 由三个部分组成,每个部分用点(“.”)隔开:

  1. Header(头部):eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
  2. Payload(负载):eyJzdWIiOiIxMjM0NTY3ODkwQUJDIiwibmFtZSI6IkhlbnJpayBMb2VzZXIiLCJpYXQiOjE2MTExNDA0MDAsImV4cCI6MTYxMTIzNDU2N30
  3. Signature(签名):_iVbBcypdse-9sjrxp9iOrGsXKBWrBB3mrHgBtukcfM

标头和有效负载都是 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 在其服务目录中提供了众多服务,同时自身又是一个包含许多组件的互联网应用,因此它广泛使用令牌,包括 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 上与我联系。

相关解决方案
数据安全和保护解决方案

保护多个环境中的企业数据,遵守隐私法规并降低操作复杂性。

    探索数据安全解决方案
    IBM® Guardium

    了解 IBM Guardium,这是一系列数据安全软件,可保护敏感的本地数据和云端数据。

     

      深入了解 IBM Guardium
      数据安全服务

      IBM 提供全面的数据安全服务,以保护企业数据、应用程序和 AI。

      探索数据安全服务
      采取后续步骤

      利用数据安全解决方案,跨混合云保护组织的数据,并简化合规要求。

      探索数据安全解决方案 预约实时演示