邪恶八进制信息安全团队技术讨论组's Archiver

EvilOctal 2005-6-27 01:31

[转载]增强 Web 服务安全性的新技术

文章作者:David Chappell<br>
信息来源:[url]http://www.microsoft.com/china/msdn/library/security/mac0304WSSecu.mspx[/url]<p><h1>增强 Web 服务安全性的新技术</h1><h2 class="subtitle"></h2><div class="date">发布日期: 1/24/2005<span class="datePipe"> | </span>更新日期: 1/24/2005</div><div class="overview"><div id=""><p><a href="http://www.msdn.microsoft.com/msdnmag/find/default.aspx?type=Au&phrase=David%20Chappell" target="_blank">David Chappell</a></p></div><div id=""><p>本文假设读者熟悉 XML 和安全性基础知识。</p></div><div id=""><p>摘要 </p></div><div id=""><p>如果没有良好的安全性,Web 服务将永远不能发挥它的潜能。本文重点讨论了 WS-Security 及其相关的技术,它们代表了 Web 服务安全性的未来。本文对这些新兴的安全标准进行了概述,并对这些安全标准的作用、工作方式和协作形式进行了说明。讨论的主题包括完整性、保密性以及如何通过公钥加密、WS-Security 和其他技术来实现完整性和保密性。本文还讨论了一些关键的 WS-Security 组件,例如 wsu 命名空间。</p></div></div><center><img src="/library/gallery/templates/MNP2.GenericArticle/../MNP2.Common/images/3squares.gif" border='0' alt="*" title="" width='30' height='6' /></center><div style="height: 18px"></div><h5 style="padding-top: 2px">本页内容</h5><table cellpadding="0" cellspacing="0" border="0" style="margin-top: 7px; margin-bottom: 12px"><tr valign="top"><td><a href="#EMAA"><img width="7" height="9" hspace="4" vspace="2" border="0" src="/library/gallery/templates/MNP2.GenericArticle/../MNP2.Common/images/arrow_px_down.gif" alt="WS-Security"></a></td><td class="onThisPage"><a href="#EMAA">WS-Security</a></td></tr><tr valign="top"><td><a href="#ELAA"><img width="7" height="9" hspace="4" vspace="2" border="0" src="/library/gallery/templates/MNP2.GenericArticle/../MNP2.Common/images/arrow_px_down.gif" alt="发送安全令牌"></a></td><td class="onThisPage"><a href="#ELAA">发送安全令牌</a></td></tr><tr valign="top"><td><a href="#EKAA"><img width="7" height="9" hspace="4" vspace="2" border="0" src="/library/gallery/templates/MNP2.GenericArticle/../MNP2.Common/images/arrow_px_down.gif" alt="完整性"></a></td><td class="onThisPage"><a href="#EKAA">完整性</a></td></tr><tr valign="top"><td><a href="#EJAA"><img width="7" height="9" hspace="4" vspace="2" border="0" src="/library/gallery/templates/MNP2.GenericArticle/../MNP2.Common/images/arrow_px_down.gif" alt="保密性"></a></td><td class="onThisPage"><a href="#EJAA">保密性</a></td></tr><tr valign="top"><td><a href="#EIAA"><img width="7" height="9" hspace="4" vspace="2" border="0" src="/library/gallery/templates/MNP2.GenericArticle/../MNP2.Common/images/arrow_px_down.gif" alt="指定策略:WS-SecurityPolicy"></a></td><td class="onThisPage"><a href="#EIAA">指定策略:WS-SecurityPolicy</a></td></tr><tr valign="top"><td><a href="#EHAA"><img width="7" height="9" hspace="4" vspace="2" border="0" src="/library/gallery/templates/MNP2.GenericArticle/../MNP2.Common/images/arrow_px_down.gif" alt="获得安全令牌:WS-Trust"></a></td><td class="onThisPage"><a href="#EHAA">获得安全令牌:WS-Trust</a></td></tr><tr valign="top"><td><a href="#EGAA"><img width="7" height="9" hspace="4" vspace="2" border="0" src="/library/gallery/templates/MNP2.GenericArticle/../MNP2.Common/images/arrow_px_down.gif" alt="建立上下文:WS-SecureConversation"></a></td><td class="onThisPage"><a href="#EGAA">建立上下文:WS-SecureConversation</a></td></tr><tr valign="top"><td><a href="#EFAA"><img width="7" height="9" hspace="4" vspace="2" border="0" src="/library/gallery/templates/MNP2.GenericArticle/../MNP2.Common/images/arrow_px_down.gif" alt="使用 SAML 和其他基于 XML 的令牌"></a></td><td class="onThisPage"><a href="#EFAA">使用 SAML 和其他基于 XML 的令牌</a></td></tr><tr valign="top"><td><a href="#EEAA"><img width="7" height="9" hspace="4" vspace="2" border="0" src="/library/gallery/templates/MNP2.GenericArticle/../MNP2.Common/images/arrow_px_down.gif" alt="小结"></a></td><td class="onThisPage"><a href="#EEAA">小结</a></td></tr></table><div id=""><p>如果没有良好的安全性,Web 服务就不能发挥它的作用。然而,SOAP 的最初设计者选择了推迟定义解决此问题的方法。由于 Web 服务开发初始希望其简单易用 — 但要确保其安全却不是一件简单的事情,因此,这是一个合理的选择。但是,安全问题不能永远推迟下去。因此,Microsoft 和 IBM 以及其他公司强强联合,共同致力于解决此问题。其成果是制定了一组提供 Web 服务安全性的规范,其中最重要的是 WS-Security。本文将对这些技术如何工作进行全面概述。</p></div><div id=""><p>从某个角度来看,Web 服务安全性的设计者所面临的任务看起来很简单。毕竟,分布式安全已经存在有效的机制,包括 Kerberos、公钥技术以及其他,因此,这些设计者所面临的任务并不是要发明新的安全机制。相反,他们的目标是定义 Web 服务领域(一个构建于 XML 和 SOAP 之上的领域)中现有安全机制的使用方式。目前已经有几个与安全相关的规范,包括: </p></div><table cellspacing="0" cellpadding="0" border="0"><tr><td class="listBullet" valign="top">•</td><td class="listItem"><div id=""><p>WS-Security:其他所有规范的基础。它定义了允许传递安全令牌的 SOAP 扩展,安全令牌可安全地对客户端进行标识和身份验证、确保消息完整性以及提供消息保密性。Web Services Security Addendum:一种附加规范,向原始文档中添加了一些细节和修正。 </p></div></td></tr><tr><td class="listBullet" valign="top">•</td><td class="listItem"><div id=""><p>WS-SecurityPolicy:指定如何定义明确声明 Web 服务优先权和要求的安全声明。 </p></div></td></tr><tr><td class="listBullet" valign="top">•</td><td class="listItem"><div id=""><p>WS-Trust:定义如何获得安全令牌。 </p></div></td></tr><tr><td class="listBullet" valign="top">•</td><td class="listItem"><div id=""><p>WS-SecureConversation:定义如何创建与 Web 服务进行特殊会话的上下文,以及如何创建用于该上下文的密钥。 </p></div></td></tr><tr><td class="listBullet" valign="top">•</td><td class="listItem"><div id=""><p>Web Services Security Profile for XML-based Tokens:定义如何将基于 XML 的技术(例如,安全声明标记语言 (SAML) 和可扩展权限标记语言 (XrML))与 WS-Security 一起使用。该规范还获得了最长规范名奖。</p></div></td></tr></table><div id=""><p>这些规范自成体系,并以此为基础构成了易使用、可协作以及相当完善的方法,以提供 Web 服务安全性。</p></div><div id=""><a name="EMAA"></a><h2>WS-Security</h2><br><div id=""><p>WS-Security 定义了向 SOAP 中添加安全性的基本技术。其宏伟目标是为 SOAP 消息提供端对端的消息级别的安全,但 WS-Security 规范并不十分冗长,细数起来也只有 20 多页。这是因为 WS-Security 几乎没有定义什么新技术,而是定义了一种使用 SOAP 的现有安全技术的方法。</p></div><div id=""><p>或许,WS-Security 定义的最基本内容是位于 SOAP 标头中的 <Security> 元素。包含该元素的 SOAP 消息的结构如<a href="http://www.msdn.microsoft.com/msdnmag/issues/03/04/WS-Security/default.aspx?fig=true#fig1" target="_blank"><b>图 1</b></a> 所示。如这个简单的架构显示,WS-Security 定义了它自己的命名空间。在任何可能的位置上,WS-Security 的设计者都会遵守现有的这些标准和技术,而只是会集中于指定如何在 SOAP 中使用它们。</p></div><div id=""><p>WS-Security 描述如何实现完整性和保密性。完整性允许接收方确保从消息中接收的数据在传输过程中没有被篡改;保密性可确保数据在传输过程中不会被窥视。它还描述了如何发送安全令牌,例如用户名/密码组合、Kerberos 票据或 X.509 证书等。下面三方面内容描述 WS-Security 如何处理其中的每个领域。</p></div></div><div id=""><div style="margin-top: 3px; margin-bottom: 10px"><a href="#top"><img width="7" height="9" border="0" src="/library/gallery/templates/MNP2.GenericArticle/../MNP2.Common/images/arrow_px_up.gif" alt="返回页首"></a><a class="topOfPage" href="#top">返回页首</a></div><a name="ELAA"></a><h2>发送安全令牌</h2><br><div id=""><p>消息接收方遇到的最基本的问题可能是:我正在和谁交谈?问题虽然简单,但答案却非想象的那么简单。在网络中表明身份的方法有多种(用户名、Kerberos 票据或 X.509 证书等),进行身份验证的方法也有不少。例如,通过用户名以及随附的密码,可以证明用户的真实身份。相反,Kerberos 票据由发行方使用票据接收方可验证其正确性的密钥进行加密。此外,可以随证书一起发送数字签名来验证用户身份。(有关数字签名的详细信息,请参阅补充文章“<a href="http://www.msdn.microsoft.com/msdnmag/issues/03/04/WS-Security/default.aspx?side=true#a" target="_blank">什么是数字签名?</a>”)</p></div><div id=""><p>WS-Security 的设计者选择了依赖多种传输方法和身份验证方法。实际上,WS-Security 根本没有定义如何进行身份验证。相反,该规范指定了如何在 SOAP 标头的 Security 元素中传输多种不同的安全令牌。令牌的接收方可以根据偏好,以任何方式使用其中包含的信息。最常见的用法可能是验证令牌发送方的身份,但也可采用其他方式使用令牌。</p></div><div id=""><p>尽管 WS-Security 规范允许任何类型的安全令牌,但它明确地定义了三种方案。最简单的(尽管不一定总是最安全的)方案是发送包含用户名和密码的安全令牌。要实现这个目标,WS-Security 定义了一个包含用户名和密码的 <UsernameToken> 元素。以下是仅包含 <UsernameToken> 的 Security 元素的一个简单示例: </p></div><pre class="codeSample"><wsse:Security
xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/12/secext">
<wsse:UsernameToken>
  <wsse:Username>Diana</wsse:Username>
  <wsse:Password>mY5ecRet</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>

</pre><div id=""><p>还定义了功能更强大的方案,例如发送摘要版密码。由于通过网络发送未加密的密码并不是一种非常有效的身份验证机制,因此很可能会使用 UsernameToken 元素来验证经由加密连接发送的 SOAP 消息,例如使用安全套接字层 (SSL) 发送的消息等。</p></div><div id=""><p>WS-Security 定义的第二个方案是发送包含 Kerberos 票据的安全令牌。像所有的安全令牌一样,在 SOAP 标头中发送的 Kerberos 票据是 Security 元素的一部分。下面是一个示例: </p></div><pre class="codeSample"><wsse:Security
xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/12/secext">
<wsse:BinarySecurityToken
  ValueType="wsse:Kerberosv5ST"
  EncodingType="wsse:Base64Binary">
   QMwcAG ...        
</wsse:BinarySecurityToken>
</wsse:Security>

</pre><div id=""><p>如该代码片段所示,Kerberos 票据是使用更一般的 <BinarySecurityToken> 元素进行发送的。该元素的 ValueType 属性表明这是一个 Kerberos Version 5 服务票据,它用于验证请求特殊服务的客户端。(当发送票据授予票据时,ValueType 为 wsse:Kerberosv5TGT。)虽然也定义了十六进制编码方案,但是票据本身使用 base64 编码表示,并且只显示其前几个字节。 </p></div><div id=""><p>WS-Security 定义的第三个方案用于表示安全令牌、X.509 证书,它也依赖于 <BinarySecurityToken> 元素。下面是一个示例: </p></div><pre class="codeSample"><wsse:Security
xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/12/secext">
<wsse:BinarySecurityToken
  ValueType="wsse:X509v3"
  EncodingType="wsse:Base64Binary">
   KkFPle ...        
</wsse:BinarySecurityToken>
</wsse:Security>

</pre><div id=""><p>您可以发现,该示例与以前所述的 Kerberos 票据示例并没有多大区别。此时,<BinarySecurityToken> 的 ValueType 属性表明正在发送 X.509 证书。再次使用了 Base64 编码,而且证书本身也是该元素内容的一部分,正如 Kerberos 票据在先前示例中起到的作用一样。</p></div><div id=""><p>与在 SOAP 消息的标头中直接嵌入安全令牌的这三个方案一起,WS-Security 还定义了 <SecurityTokenReference> 元素。正如其名称所示,该元素包含一个指示从何处查找安全令牌的 URI。这样,消息接收方就可以从令牌所在地(例如 Internet 上的已命名位置)将其取回。该元素也可用于引用包含在该消息的 SOAP 标头中的安全令牌,在以下部分中将详细说明这一功能的用途。</p></div><div id=""><p>WS-Security 采用一种非常灵活的方法进行传输和身份验证,然而这里还有一个重要含义:虽然两个系统都符合 WS-Security 的标准,但二者仍然不能进行相互验证。例如,其中一个系统可能只支持 Kerberos,而另一个系统只支持使用 X.509 证书进行基于数字签名的身份验证。仅仅允许使用 WS-Security 是不够的。有关确切地使用何种类型的安全令牌,还需要有一些协议。</p></div></div><div id=""><div style="margin-top: 3px; margin-bottom: 10px"><a href="#top"><img width="7" height="9" border="0" src="/library/gallery/templates/MNP2.GenericArticle/../MNP2.Common/images/arrow_px_up.gif" alt="返回页首"></a><a class="topOfPage" href="#top">返回页首</a></div><a name="EKAA"></a><h2>完整性</h2><br><div id=""><p>使用 SOAP 消息进行传输和身份验证是一个多方面的问题,可能存在多种解决方案。因此,WS-Security 采用了一种非常广泛的方法。但是,更明确的一点是要为 SOAP 消息提供完整性。解决方案是使用某种类型的数字签名。幸运的是,已经有了针对该领域的 W3C 标准。该标准称为 XML 签名,它为数字签名 XML 文档提供了详细的机制。WS-Security 没有彻底改造已有标准,而是简单地利用现有规范,并就如何在 SOAP 消息中使用这些规范提出了一些具体细节。</p></div><div id=""><p>XML 签名规范定义的主要内容是 <Signature> 元素,该元素的内容包括数字签名本身以及有关如何生成该签名的信息。虽然已经有了一些方案,但一个典型的 <Signature> 实例与 SOAP 中使用的相同,也包含 <SignedInfo> 和 <KeyInfo> 元素。</p></div><div id=""><p><SignedInfo> 元素描述正在进行签名的信息。该元素本身包含多个子元素,每个子元素都指定了一些有关已签名信息的内容。其中最重要的子元素包括以下元素: </p></div><table cellspacing="0" cellpadding="0" border="0"><tr><td class="listBullet" valign="top">•</td><td class="listItem"><div id=""><p>标识用于在生成签名之前将此 XML 文档转换为标准形式的算法。这个过程是必须的,因为要使数字签名生效,已签名文档的每一方视图都必须逐位相同。然而,如果不进行标准化,那么两个语义相同的 XML 文档可能在位级上存在区别。例如,其中一个可能表示带有回车/换行符对的分行符,而另一个可能只使用换行符。标准化可将 XML 文档转换为标准形式,从而确保双方在签名之前能够以相同的方式查看文档。 </p></div></td></tr><tr><td class="listBullet" valign="top">•</td><td class="listItem"><div id=""><p>标识用于创建数字签名的算法。XML 签名标准和 WS-Security 均要求支持数字签名标准(使用安全哈希算法 (SHA)-1 和 DSA 算法创建消息摘要),也建议支持使用 SHA-1 和 RSA 算法。 </p></div></td></tr><tr><td class="listBullet" valign="top">•</td><td class="listItem"><div id=""><p><Reference> 标识正在进行签名的信息以及对其进行的任何转换。与 SOAP 一同使用时,该部分签名一般引用此 SOAP 消息的已签名部分,例如,正文和标头部分。<Reference> 元素还包含从已签名信息生成的 base64 编码的消息摘要,并指定诸如 SHA-1 等用于创建摘要的算法。 </p></div></td></tr><tr><td class="listBullet" valign="top">•</td><td class="listItem"><div id=""><p><SignatureValue> 包含构成数字签名的字节。 </p></div></td></tr><tr><td class="listBullet" valign="top">•</td><td class="listItem"><div id=""><p><KeyInfo> 指示验证签名时应使用的密钥。密钥可以用多种方式进行标识,例如引用一个包含适当公钥的证书。由于接收方可能会通过其他手段了解要使用的密钥,因此甚至可以完全忽略该元素。</p></div></td></tr></table><div id=""><p>倘若了解 XML 签名的 <Signature> 元素的这种基本特性,就可以理解 WS-Security 是如何使用该元素的。<a href="http://www.msdn.microsoft.com/msdnmag/issues/03/04/WS-Security/default.aspx?fig=true#fig2" target="_blank"><b>图 2</b></a> 是包含数字签名的 SOAP 消息形式的一个示例。</p></div><div id=""><p>在本例中,标头的 <Security> 元素以 <BinarySecurityToken> 开头。该元素与前面部分中所示的 X.509 证书示例几乎完全相同。唯一的区别在于,该元素使用由 Web Services Security Addendum 定义的 Id 属性来为该 <BinarySecurityToken> 提供名称。(请查看补充文章“<a href="http://www.msdn.microsoft.com/msdnmag/issues/03/04/WS-Security/default.aspx?side=true#b" target="_blank">wsu 命名空间</a>”,以获得详细信息。)此处的 Id 属性值为“X509Cert”,从标头的其他位置可以引用该属性值。您不久将会看到,当消息中也包含数字签名时,这个特性非常有用。</p></div><div id=""><p>接下来是由 XML 签名标准定义的 <Signature> 元素,包括前面描述的几个子元素:<SignedInfo>、<SignatureValue> 和 <KeyInfo>。<SignedInfo> 元素内包含用于对该 XML 文档进行标准化以及创建其数字签名的算法的标识符。<Reference> 元素具有一个 URI 属性,可以准确指定正在进行签名的内容。在本示例中,仅对正文进行了签名,因此,这个 URI 与消息的 <Body> 元素所关联的 Id 属性值相匹配。Reference 元素也包含两个子元素:<DigestMethod> 和 <DigestValue>。其中第一个子元素标识用于创建这个数字签名的消息摘要的算法,而第二个子元素包含消息摘要值本身。由于在本例中仅对正文进行了签名,因此,这个摘要是从 SOAP 消息的 <Body> 元素的标准化版本中计算得出的。</p></div><div id=""><p>接下来的 <Signature> 子元素 <SignatureValue> 包含数字签名本身的字节,该数字签名通过使用签名者的私钥对消息摘要进行加密创建的。最后是 <Signature> 中的最后一个子元素 <KeyInfo>,它标识验证这个签名应使用的公钥的位置。在本示例中,消息中先出现那个密钥(在安全令牌中),然后通过 <SecurityTokenReference> 进行引用。使用该密钥的 Id 属性 "X509Cert" 对其进行标识。</p></div><div id=""><p>对于许多 Web 服务应用程序,确保数据完整性至关重要。具有一种经过良好定义并被广泛接受、可为 SOAP 提供这种服务的方法也非常有用。由于提供有效的签名和受信任的证书证明了专用私钥的知识,对于身份验证,使用公钥技术创建的数字签名也非常有用,验证某人的身份亦是如此。然而,在实际应用中创建 XML 文档的数字签名并不是最简单的事情。准确地说,必须首先标识要进行签名的内容,然后进行标准化,再进行实际签名。由于 WS-Security 允许为相同的消息创建多个签名,每个签名可能由消息途径中不同的接收方所创建,并且每个签名可能传输消息的不同部分或存在重叠的部分,因此,它可能比此处所示的示例要复杂得多。根据 W3C XML 签名标准来构建所有这些内容非常有意义,但是使用这种 WS-Security 的 SOAP 标头一定会比那些不需要特定安全服务的要大得多、复杂得多。</p></div></div><div id=""><div style="margin-top: 3px; margin-bottom: 10px"><a href="#top"><img width="7" height="9" border="0" src="/library/gallery/templates/MNP2.GenericArticle/../MNP2.Common/images/arrow_px_up.gif" alt="返回页首"></a><a class="topOfPage" href="#top">返回页首</a></div><a name="EJAA"></a><h2>保密性</h2><br><div id=""><p>对于许多重要的应用程序来说,防止数据在传输中被人窥探,并确保其安全性非常重要。因此,WS-Security 定义的第三个服务是保密性,它提供了一种在 SOAP 消息传输之前对其进行部分加密或全部加密的方法。WS-Security 的设计者以同样的方式解决了完整性问题,他们选择了在现有保密标准的基础上构建保密性,而不是创建全新的标准。他们再一次从 W3C 的现有标准中选择了一个称为 XML 加密的规范。通过该标准,WS-Security 允许对 SOAP 消息的标头信息、正文以及任何附件进行部分加密或全部加密。XML 加密规范并不是一种十分复杂的文档。例如,WS-Security 仅使用了由该标准定义的三个 XML 元素:<EncryptedData>、<EncryptedKey> 和 <ReferenceList>。</p></div><div id=""><p>其中最重要的自然是 <EncryptedData>。正如其名称所示,该元素包含在子元素中称为 <CipherData> 的实际加密数据。该元素也可包含指示所使用的加密算法的子元素、加密所使用的密钥以及其他内容。<a href="http://www.msdn.microsoft.com/msdnmag/issues/03/04/WS-Security/default.aspx?fig=true#fig3" target="_blank"><b>图 3</b></a> 显示了一个示例,说明发送方选择对按 WS-Security 定义的消息正文进行加密时,一个简单的 SOAP 消息的形式。</p></div><div id=""><p>首先注意消息中没有出现 SOAP 标头。尽管这在实际应用程序中是不可能的,但可能使用由 WS-Security 定义的 XML 加密,而不含有 Security 元素或任何其他 Header 元素。在这个简单的示例中,消息正文仅包含一个带有三个子元素的 <EncryptedData> 元素。其中第一个子元素 <EncryptionMethod> 指示加密数据时所使用的算法。在本示例中,选择了对称算法 TripleDES,并且使用相同的密钥来加密和解密数据。接下来的子元素是从 XML 签名中借用的 <KeyInfo>。此时,假设双方均已知道可以在加密和解密中使用的所有密钥,因此,唯一要做的就是通知选定的接收方。虽然密钥可以使用任意名称,但是也可以使用 LDAP 风格的识别名称来命名密钥。因此,该示例指定密钥名为“CN=Key13, C=US”。无论使用何种名称,重要的是双方均可以准确地了解该名称所引用的密钥。最后是 <CipherData> 子元素,它在其 <CipherValue> 子元素中带有实际加密数据的 base64 编码。</p></div><div id=""><p>也可能在相同的消息中传输加密的密钥,这个消息带有使用该密钥进行加密的数据。当使用对称密钥加密数据时,就经常会出现这种情况,如<a href="http://www.msdn.microsoft.com/msdnmag/issues/03/04/WS-Security/default.aspx?fig=true#fig3" target="_blank"><b>图 3</b></a>中的 TripleDES 示例所示,然后使用消息接收方的公钥对对称密钥进行加密并随数据一道发送。消息到达时,接收方可以使用其私钥解密嵌入的对称密钥,然后使用该对称密钥对实际数据进行解密。为了发送加密的密钥,XML 加密定义了一个带有识别名 <EncryptedKey> 的元素。为了与 SOAP 消息一起使用,WS-Security 指定了该元素应当出现在 <Security> 标头中。因此,带有加密数据和读取该数据所需的加密对称密钥的 SOAP 消息可能如<a href="http://www.msdn.microsoft.com/msdnmag/issues/03/04/WS-Security/default.aspx?fig=true#fig4" target="_blank"><b>图 4</b></a> 所示。</p></div><div id=""><p>与<a href="http://www.msdn.microsoft.com/msdnmag/issues/03/04/WS-Security/default.aspx?fig=true#fig3" target="_blank"><b>图 3</b></a>中虚拟的简单示例不同,<a href="http://www.msdn.microsoft.com/msdnmag/issues/03/04/WS-Security/default.aspx?fig=true#fig4" target="_blank"><b>图 4</b></a><b></b>中的 SOAP 消息包含了带有 Security 元素的标头。这个元素只包含在 XML 加密标准中定义的 <EncryptedKey> 子元素。<EncryptedKey> 的格式与 <EncryptedData> 的格式非常相似,在此示例中,它具有三个熟悉的子元素:<EncryptionMethod>、<KeyInfo> 和 <CipherData>。此处要进行加密的是对称密钥,因此,<EncryptionMethod> 描述的是如何对该密钥进行加密,而不是如何对实际数据进行加密。由于我们一直假设这是使用接收方的公钥进行加密的对称密钥,因此,该元素指示对这个密钥进行加密时使用的 RSA 算法。<KeyInfo> 元素指定作为此 <EncryptedKey> 的一部分进行传输的对称密钥的名称,并且由于我们假设该密钥与前面示例中的相同,因此,它具有相同的名称。与先前的 <EncryptedData> 元素不同,此 <EncryptedKey> 中的 <CipherData> 元素包含加密的对称密钥,而不是任何用户数据。</p></div><div id=""><p><EncryptedKey> 元素还具有 <EncryptedData> 中所没有的一个新的子元素。该元素 <ReferenceList> 在将这个密钥与使用其进行加密的数据相关联的过程中发挥了重要作用。它包含一个标识该 SOAP 消息部分的 URI,该消息是使用 <EncryptedKey> 元素中包含的密钥进行加密的。在<a href="http://www.msdn.microsoft.com/msdnmag/issues/03/04/WS-Security/default.aspx?fig=true#fig4" target="_blank"><b>图 4</b></a><b></b>中,整个 SOAP

页: [1]
© 1999-2008 EvilOctal Security Team