本文件已封存並已停止維護。

簡式 Web 權杖 (SWT)

更新日期: 2015年6月

2009 本文的設計旨在作為針對網際網路工程任務推動小組 (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)

此規格可根據 Open Web Foundation Agreement 0.9 版 (網址為 [http://groups.google.com/group/open-web-board/web/owf-agreement-for-final-specs---pt-9-draft]) 取得 [附註:更新的 URL 擱置中。] 您可以在 [插入群組協議存放區 URI] 檢閱此規格的已簽署 Open Web Foundation Agreement 0.9 版複本,也可以將其他合作對象包括至上面列出的合作對象。此規格的使用方式可能會受限於其他協力廠商權利。此規格係依「現況」提供。參與者明確宣示與此規格相關的任何擔保 (明示、默示或其他方式),包括適售性之默示擔保、不侵害他人、特定目的之適用性或所有權。實作或以其他方式使用此規格的整個風險均由規格實作者和使用者承擔。在任何情況下,不論是否違反合約、侵權 (包括過失) 或其他方式,以及是否已將損害發生之可能通知其他一方,任何一方均不需承擔任何其他一方因與此規格或其控管協議有關的任何行動所造成的任何利潤損失或任何形式的間接、特殊、偶發或衍生性損害。

簡易 Web 權杖 (SWT) 會定義一種格式,以傳輸簡潔且格式化的簡易宣告,以輕易地包括在通訊協定 (例如 HTTP) 標頭中。簡單宣告可以表示為一組名稱/值對。HTML 表單編碼的值符合充分了解的所需目標和安全的 HTTP 標頭格式。

因為 SWT 將傳達重要的身分識別與存取資訊,所以我們需要一種方式來止竄改。因此,我們引進 SWT - HMACSHA256 中的唯一強制名稱/值對。這一定是 SWT 的最後一個名稱/值對,而且值為 SWT 中其他名稱/值對的 SHA 256 HMAC。

SWT 中使用其他名稱/值對的選擇超出此規格的範圍。話雖如此,有許多條件和屬性,已證明其可用於各種不同的宣告架構,特別是:簽發者、觀眾和 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 編碼使用 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=

在此範例中,簽發者和 ExpiresOn 是來自此規格的保留名稱。屬性 com.example.group 是 example.com 網域擁有者所建立之群組的語法和語意的某個同意定義。over18 是 SWT 的產生者和取用者者之間決定的私下定義屬性。

在我們可以編碼 SWT 之前,必須將 ExpiresOn 變成從 1/1/1970 午夜 UTC 直到到期時間 1/1/2010 午夜的秒數。結果是 1262304000。

  1. 將名稱/值對編碼為 HTML 表單。結果是 (為了便於閱讀而插入分行符號):

    Issuer=issuer.example.com&
    ExpiresOn=1262304000&
    com.example.group=gold&
    over18=true
    
  2. 接著,使用金鑰計算前一個值的 HMAC。

  3. Base64 編碼 HMAC。結果是:

    AT55+2jLQeuigpg0xm/vn7tjpSGXBUfFe0UXb0/9opE=
    
  4. URL 編碼所產生之 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. 接著,url 解碼 submittedHMAC 且結果為:

    AT55+2jLQeuigpg0xm/vn7tjpSGXBUfFe0UXb0/9opE=
    
  3. 然後,我們使用 noHMACSWT 和 HMAC 金鑰值來計算 localHMAC、以 base64 編碼結果,並取得下列 localHMAC 值:

    AT55+2jLQeuigpg0xm/vn7tjpSGXBUfFe0UXb0/9opE=
    
  4. 我們比較 submittedHMAC 和 localHMAC ,並查看它們是否為相同字串。然後,我們解碼 noHMACSWT,以取得 SWT 值的存取權。

下列名稱/值對是選擇性的。定義它們在於讓許多常見案例在用到時易於互通。

 

名稱 值語法 值語意

Issuer

Utf-8 字串

識別簽發 SWT 的合作對象。

ExpiresOn

ASCII 字串,表示不帶正負號的基底 10 整數。

識別不接受 SWT 進一步處理的時刻。

到期日期/時間記錄為從 1970-01-01T0:0:0Z 直到到期那一刻 (以 UTC 測量) 的秒數。

適用對象

Utf-8 字串

識別適用 SWT 的 SWT 對象。意圖為,如果 SWT 取用者收到 SWT,但其具有的對象值無法識別 SWT 對象,則 SWT 會遭到拒絕。

SWT 產生者可以使用反向 DNS 名稱或 URI,來定義其他屬性。

SWT 的生產者和取用者可能同意任何不是保留名稱或公用名稱的屬性名稱。這些名稱不得位於上節「保留名稱 」中所定義的保留名稱清單中。不同於公用名稱,這些私用名稱容易發生衝突,因此請謹慎使用。

另請參閱

顯示: