本文档已存档,并且将不进行维护。

简单 Web 令牌 (SWT)

更新时间: 2015年6月

本 2009 版文件旨在用作针对 Internet 工程任务组 (IETF) 提议的简单 Web 令牌 (SWT) 标准。尽管本文并不完整并且不属于帮助主题,但它提供有关 SWT 令牌格式和用法的有用信息。

版本 0.9.5.1,2009 年 11 月 4 日

简单 Web 令牌 (SWT) 提供了一种格式用于在两个参与方之间传输断言。断言是一组经过 HTML 格式编码的名称/值对,SHA 256 HMAC 使用参与方之间共享的密钥对 生成的字符串断言。

  • Dick Hardt (dick.hardt@microsoft.com),编辑

  • Yaron Goland (yarong@microsoft.com)

本规范在开放 Web 基金会协议版本 0.9 下提供,网址为 [http://groups.google.com/group/open-web-board/web/owf-agreement-for-final-specs---pt-9-draft] [注:更新的 URL 待定。] 你可以在 [插入小组协议存储 URI] 中查看本规范的开放 Web 基金会协议版本 0.9 的签名副本,其中还可能包含上面所列条款的其他参与方。使用本规范需要尊重其他第三方的权利。本规范“按原样”提供。贡献者明确表示不提供任何保证(明示、暗示或其他保证),包括对适销性、不侵权性、特定用途适用性或者与本规范相关权益的暗示保证。实施或使用本规范存在的任何风险由规范实施者和用户承担。无论何时,对于由于以任何形式运用本规范或其主控协议而产生的任何形式和性质的间接、特殊、意外或因果性损害和利润损失,任何一方均不对任何其他一方承担任何责任,不管这种损害和损失是由违反合同、民事侵权(包括疏忽)或其他因素造成的,也不管其他一方是否已被告知发生此类损害的可能性。

简单 Web 令牌 (SWT) 定义了一种格式,用于传输在经过格式设置后可方便包含在 HTTP 等协议的标头中的紧凑式简单断言。简单的断言可表示为一组名称/值对。HTML 格式编码值符合易于理解、格式对于 HTTP 标头安全的目标。

由于 SWT 将要传递重要的标识和访问信息,我们需要采用某种方式来防止篡改。因此,我们在 SWT 中引入了唯一必需的名称/值对 - HMACSHA256。它始终是 SWT 中的最后一个名称/值对,值为 SWT 中其他名称/值对的 SHA 256 HMAC。

SWT 中选择使用的其他名称/值对不在本规范的范畴内。即便如此,有大量的条件和属性已在各种断言框架中证明了其实用性,具体而言:Issuer、Audience 和 ExpiresOn。尽管使用这些名称/值对不是强制性的,但我们在此处定义了它们以方便实现互操作性。

最后,我们预期交换 SWT 的参与方将会创建许多属性。我们使用反向 DNS 名称来帮助简化新属性名称的创建,而无需担心名称冲突。我们还支持使用 URI 作为名称。既不是反向 DNS 名称也不是 URI 的名称是私有名称,由 SWT 的生成者与使用者之间的协议定义,因此容易发生冲突。本规范中定义的名称是保留的。

本文档中的关键字“必须”、“不得”、“需要”、“应”、“不应”、“应该”、“不能”、“建议”、“可以”和“可选”根据 [RFC2119](Bradner,B.,“RFC 中用于指示要求级别的关键字”)予以解释。域名示例使用 [RFC2606](Eastlake,D. 和 A. Panitz,“保留的顶级 DNS 名称”)

生成 SWT 的一方是 SWT 生成者。验证 SWT 的一方是 SWT 使用者。在生成 SWT 之前,生成者和使用者已同意在 SWT 中包含属性,并已交换交换带外随机生成的 256 位密钥。若要生成 SWT,生成者需要执行以下步骤:

  1. 收集要在 SWT 中传输的名称/值对,并根据 HTML 4.01 的 17.13.4 条款将其格式编码为 application/x-www-form-urlencoded

  2. 将格式编码的 SWT 和商议的密钥输入到 SHA 256 HMAC 过程。

  3. 获取生成的 HMAC 值,并根据 RFC 4648 的第 4 部分使用 Base64 对其编码。

  4. 遵循格式编码规则,将名称“HMACSHA256”和 base 64 编码的 HMAC 值添加到格式编码的 SWT 的末尾。

SWT 的使用者执行以下步骤,以验证生成者生成的且尚未篡改的 SWT:

  1. 获取提交的 SWT 并将字符串拆分为“&HMACSHA256 =”前面的部分以及剩余的部分,即 URL 编码的 HMAC。第一个部分是 noHMACSWT。

  2. URL 解码 SWT 字符串的剩余部分。这是 submittedHMAC。

  3. 使用议定的密钥生成 noHMACSWT 的 HMAC,然后根据 RFC 4648 的第 4 部分使用 Base64 per Base64 编码进行编码。生成的字符串将是 localHMAC。

  4. 对 submittedHMAC 和 localHMAC 执行字符与字符的比较。如果字符串相等,则 SWT 上的 HMAC 有效。

SWT 生成者想要颁发包含以下信息的 SWT:

Issuer = issuer.example.com
ExpiresOn = 1/1/2010, Midnight
com.example.group = gold
over18 = true

包含以下 HMAC 密钥值(以 base 64 表示):

N4QeKa3c062VBjnVK6fb+rnwURkcwGXh7EoNK34n0uM=

在此示例中,Issuer 和 ExpiresOn 是本规范中的保留名称。属性 com.example.group 是 example.com 域所有者创建的组的语法和语义的某个商定定义。over18 是在 SWT 的生成者与使用者之间调解的私人定义的属性。

在为 SWT 编码之前,我们需要将 ExpiresOn 转换成从 1970 年 1 月 1 日午夜(UTC 时间)到过期时间,即 2010 年 1 月 1 日午夜相隔的秒数。结果为 1262304000。

  1. 将名称/值对编码为 HTML 格式。结果为(插入换行符以便于阅读):

    Issuer=issuer.example.com&
    ExpiresOn=1262304000&
    com.example.group=gold&
    over18=true
    
  2. 接下来,使用密钥计算前一个值的 HMAC。

  3. 对 HMAC 进行Base64 编码。结果为:

    AT55+2jLQeuigpg0xm/vn7tjpSGXBUfFe0UXb0/9opE=
    
  4. 对生成的 base64 编码 HMAC 进行编码,然后将它附加到断言的末尾。生成的 SWT 为(插入换行符以便于阅读):

    Issuer=issuer.example.com&
    ExpiresOn=1262304000&
    com.example.group=gold&
    over18=true&
    HMACSHA256=
    AT55%2B2jLQeuigpg0xm%2Fvn7tjpSGXBUfFe0UXb0%2F9opE%3D
    

  1. 使用以下项拆分 SWT: &HMACSHA256= 我们将获得 noHMACSWT 字符串(添加了换行符以便于阅读):

    Issuer=issuer.example.com&
    ExpiresOn=1262304000&
    com.example.group=gold&
    over18=true&
    
    和 submittedHMAC 字符串:

    AT55%2B2jLQeuigpg0xm%2Fvn7tjpSGXBUfFe0UXb0%2F9opE%3D
    
  2. 接下来,对 submittedHMAC 进行 URL 解码,结果为:

    AT55+2jLQeuigpg0xm/vn7tjpSGXBUfFe0UXb0/9opE=
    
  3. 然后,我们使用 noHMACSWT 和 HMAC 密钥值计算 localHMAC,并对结果进行 base64 编码。将获得以下 localHMAC 值:

    AT55+2jLQeuigpg0xm/vn7tjpSGXBUfFe0UXb0/9opE=
    
  4. 将 submittedHMAC 和 localHMAC 进行比较,发现它们是相同的字符串。然后,我们对 noHMACSWT 进行 URL 解码,以访问 SWT 值。

以下名称/值对是可选的。定义这些名称/值对的目的是为了方便与用到它们的许多常见方案互操作。

 

Name 值语法 值语义

Issuer

UTF-8 字符串

标识颁发 SWT 的一方。

ExpiresOn

一个 ASCII 字符串,表示无符号的 base 10 整数。

标识不接受对 SWT 做进一步处理的时间。

过期日期/时间记录为从 1970-01-01T0:0:0Z 开始,到过期时为止所经历的秒数(以 UTC 计量)。

读者

UTF-8 字符串

标识 SWT 针对的 SWT 受众。其用途是,如果 SWT 使用者收到了受众值未标识 SWT 受众的 SWT,则拒绝该 SWT。

SWT 生成者可以使用反向 DNS 名称或 URI 来定义其他属性。

SWT 的生成者和使用者可针对不属于反向名称或公用名称的任何属性名称进行协商。这些名称不得包含在上述“保留的名称”部分中定义的保留名称列表中。与公用名称不同,这些私用名称容易发生冲突,因此应谨慎使用。

另请参阅

显示: