基于.Net平台WEB服务通信安全设计

时间:2022-07-11 03:42:56

基于.Net平台WEB服务通信安全设计

摘要:主要讨论了.Net环境下Web Service的体系结构以及Web服务的调用过程。针对在Web Service通信过程中可能存在的安全漏洞,从消息的真实性,机密性,完整性方面进行摸索,可行性的实现了身份认证,SOAP扩展,XML的加密以及数字签名,从而保证Web服务的通信安全。

关键词: Web Service;身份认证;数字签名加密;SOAP扩展

中图分类号:TP311文献标识码:A文章编号:1009-3044(2012)10-2438-03

Web Service是一种部署在Web上的对象,它们具有对象技术所承诺的所有优点,同时,Web Service是建立在以XML为主的、开放的Web规范技术基础上,因此具有比任何现有的对象技术更好的开放性,是建立可操作的分布式应用程序的新平台。它的设计目标就是简单性和扩展性,这有助于大量异构程序和平台之间的互操作性,从而使存在的应用程序能够被广泛的用户访问。

随着移动开发热的推动,Web Service的推广迎来一轮新的高潮。但是由于设计上的不同,Web Service应用带来了新的攻击类型:黑客把恶意代码附加在正常代码上,通过在输入域中输入,从而进入系统。毋庸质疑,Web Service通信安全的研究意义重大。

1Web Service体系结构简介

Web Service体系结构是由服务提供者,服务注册中心以及服务请求者共同构建而成的。通俗的理解:服务提供者提供自定义的服务以及访问的接口;服务注册中心的主要功能则注册已经的网络服务,进行整理分类以供服务请求者的查找;服务请求者可以通过已经的接口进行服务的访问。彼此间交互着,查找以及绑定的操作。

UDDI(统一描述、发现和整合)建了一个平立、开放的框架,通过因特网来描述服务,发现业务,并且整合业务服务。它是一套基于Web分布式的、为Web服务提供的信息注册中心的实现标准规范。在Web服务被注册的同时,该标准也能帮助服务请求者找到所需求的服务。

WSDL(Web Service Description Language) Web描述语言将Web服务描述定义为一组服务访问点,客户端可以通过这些服务访问点对包含面向文档信息或面向过程调用的服务进行访问(类似远程过程调用)。WSDL首先对访问的操作和访问时使用的请求/响应消息进行抽象描述,然后将其绑定到具体的传输协议和消息格式上以最终定义具体部署的服务访问点。

SOAP(Simple Object Access Protocol)简单对象访问协议是基于XML实现互联网信息交互的协议。SOAP消息根据实现模式可以分为请求消息和响应消息,实际交互中将请求或者响应消息的参数作为XML节点可以实现跨平台的异构传输。虽然SOAP的请求消息和响应消息略有不同,但是SOAP消息通常是由一个SOAP Envelope、一个可选的SOAP Header和一个SOAP Body组成的XML文档。

2Net平台下的通信安全设计方案

2.1基于SoapHeader和来源IP实现安全认证

Header在Soap消息中提供了一种传递信息的途径,通过Header属性是可以让消息接受者知道应该处理该消息,这些信息可以是与要处理的消息相关联的信息或指示,但是它传递的信息不是应用程序的有效载荷。

Header是可以在Soap消息传递路径中的中间节点处理的。SoapHeader在缺省情况下由客户端对象发送给Web Service,我们可以通过SoapHeader来加载控制信息实现安全认证,.Net平台下实现的具体步骤如下:

1)创建继承自System.Web.WebServices.SoapHeader的自定义SoapHeader类型。

2)在WebService中创建拥有public访问权限的自定义SoapHeader字段。

3)在使用SoapHeader的WebMethod上添加SoapHeaderAttribute访问特性。

4)生成器会自动为客户端生成同名的自定义SoapHeader类型,同时还会为类型添加一个SoapheaderValue。

SoapHeader多数情形下用来传递类似于用户身份的一些控制信息,当然它的作用远不止这些,有待于实际应用中发掘。

除此之外,在服务端,我们可以通过HttpContext.Current.Request.UserHostAddress来获取客户端的IP地址,我们只允许指定的IP的服务端进行访问,保证点对点安全。

2.2通过SOAP扩展修改SOAP消息

Net平台下的SOAP扩展是是一种有效的作用于SOAP消息的拦截机制,能够在SOAP请求或响应传输之前操纵它们。也就是说,我们可以在SOAP请求消息或者响应消息传输前实现SOAP消息的修改,通过SOAP消息的修改我们可以实现报文的加密或者数字签名,增强消息的通信安全。需要注意的是:当对SOAP消息进行SOAP扩展后,必须在服务端和客户端都对消息进行相应的扩展。

.Net平台下实现使用SOAP扩展修改SOAP消息需如下步骤:

1)从SoapExtension派生一个类。

2)保存对Stream对象的引用,这些对象表示SOAP扩展前后未来的SOAP消息。

3)初始化SOAP扩展特定的数据。

4)在适当的SoapMessageStage或阶段中处理SOAP消息。

public override void ProcessMessage(SoapMessage message){

switch (message.Stage)

{

case SoapMessageStage.BeforeSerialize://在序列化之前,就是还未输出soap消息

//ToDo break;

case SoapMessageStage.AfterSerialize:/ /在序列化之后,就是将要输出soap消息

//ToDo break;

case SoapMessageStage.BeforeDeserialize://在反序列化之前,正在得到输入的soap消息

//ToDo break;

case SoapMessageStage.AfterDeserialize: //在反序列化之后,就是得到输入消息

//ToDo break;

}

2.3实现SOAP消息的XML Encryption

通过向基础结构中注入SOAP扩展,可以检查或修改每个序列化和反序列化阶段前后的SOAP消息。在此基础上,开发过程中可以将客户端的SOAP请求或者服务端的SOAP响应进行自定义的XML加密。

加密SOAP扩展可以在.NET Framework序列化客户端参数之后对SOAP消息的XML部分进行加密,而在.NET Framework反序列化该SOAP消息之前,它又可以在Web服务器上对该SOAP消息进行解密。

XML Encryption是W3C加密XML的标准。加密的过程实际上是先对XML节点的内容进行加密,然后再将替换先前节点的内容。XML的格式不受影响。加密可根据安全性级别的要求采用不同的算法,总体上分为对称加密和非对称加密。

XML Encryption允许只对文档中部分敏感数据加密,将其他的数据仍处在非加密的状态,缩短了密文的长度,提高了传输效率。

不仅如此,XML加密还可以对整个XML文件或者XML文件中的某个元素进行加密。XML Encryption体现了自包含的特质,是在原资源的位置上创建一个新的EncryptedData元素完全的替代原资源(使用CipherReference除外)。EncryptedData元素包含着一些列用于描述算法的子元素,同时也包含着密钥信息。KeyInfo元素下的EncryptedKey元素及其子元素包含着关于被保存的密钥的信息。

在安全性要求更高的项目中,可对整篇文档多重加密,当XML文档发送给多个接收者时,能够保证各个接收者根据自己的密钥读取相应的数据信息,而对其余的数据是不可见的。

2.4对SOAP消息实现数字签名

在实际的应用中还需要客户端对SOAP消息进行一次签名,并将签名连同消息一起发送;服务端接受消息后,需要对SOAP消息中的签名进行认证。通过验证才能确定消息在传输过程中没有被更改过,而验证的用户就是对消息签名的用户。

采用传统的数字签名虽然也可以保证整个XML文档或消息的不可抵赖性、身份认证和数据完整性,但在Web Service的应用环境下却是不够的。若对整个文档或消息进行数字签名,则签名后不能再对其进行修改,因而需要能实现对XML文档或消息的细粒度控制,才能适应Web Service的灵活性要求。引入XML签名,可对已签名文档继续添加签名,同时也能实现对文档选择进行细粒度的签名,根据需要选择不同的元素或元素的属性进行数字签名。

对SOAP消息的数字签名同样可以发生在.NET Framework序列化客户端参数之后,但是在.NET Framework反序列化该SOAP消息之前,必须对该消息的签名进行验证。

在.Net平台的System.Security.Cryptography的命名空间下提供了加密服务功能,包括安全的数据编码和解码,以及许多其他操作,这里我们用来实现XML数字签名:

1)在.NET序列化客户端参数之后创建CspParameters对象,并指定密钥容器的名称。

2)使用RSACryptoServiceProvider类生成一个对称密钥。将签名RSA密钥添加到SignedXml对象。

3)创建说明签名内容的Reference对象。并将XmlDsigEnvelopedSignatureTransform对象添加到Reference对象中,然后将Reference对象添加到SignedXml对象中。

4)通过调用ComputeSignature方法计算签名。

5)检索签名(一个元素)的XML表示形式,并将它保存到一个新的XmlElement对象中。

在.NET Framework反序列化该SOAP消息之前,载入SOAP报文后找到元素,并创建新的XmlNodeList对象。加载XML的第一个元素到,使用CheckSignature方法和RSA公钥检查签名。返回的是一个布尔逻辑值,若为false表示验证签名失败,随即可以抛出异常终止Web服务的调用。

3结束语

Web Service通信安全是企业级开发中的关键模块。文章从这一角度出发,采用SoapHeader加载控制信息,IP来源验证,SOAP扩展加密,SOAP报文的数字签名等方法来保证服务通信过程中消息的真实性、保密性和完整性,可行的实现了Web Service的安全访问控制。

参考文献:

[1]顾宁,刘家茂,柴晓路Web Services原理与研发实践[M].北京:机械工业出版社,2005.

[2]乔波.Web+Services安全技术研究[J].信息安全与通信保密,2007(8).

[3]周必水,倪慧莉.简单对象访问协议SOAP的研究与分析[J].计算机工程与设计,2002(3).

[4]钱权.严家德Web Services的安全机制[J].计算机工程,2007,33(22).

上一篇:事故树分析方法在家用燃气热水器中毒事故中的... 下一篇:睿智商务华硕商务笔记本B33新品上市