一种基于加密技术的Web服务安全方法
2011-02-09全立新
全立新
(湖南财政经济学院 信息管理系,长沙 410205)
0 引言
Web服务[1]技术已成为新一代计算技术的导向,在电子商务、系统集成等多个领域发挥着日益重要的作业。然而作为一种新兴技术,Web服务面临着许多挑战。Web服务同CORBA、COM+、RMI这些分布式对象系统相比,在安全、事务处理能力、可管理能力等方面有所欠缺,尤其安全问题亟待解决[2]。
考察现有的一些安全技术[3],1)防火墙:当用户想要把访问限定在一个专用网络中的计算机上时,则可以使用防火墙技术,在一定程度上限制Web服务应用范围;2)SSL(Secure Sockets Layer,安全套接字层):虽然SSL可以有效的建立安全的通信,但是它会对性能造成很大的影响。3)VPN(Virtual Private Networks,虚拟专用网络):VPN可在共享的或公共的网络中建立一个专用的网络环境,是一种端到端的连接,但需要花费较长的时间建立连接。4)基本身份验证:使用明文(采用Base64编码)直接传送用户名和密码,任何人都可以查看其内容,不太安全。5)SSL上的基本身份验证:这种方式在安全的SSL连接中传送用户名和密码,杜绝了密码被截获和破解的危险,它是安全的。但不足在于使用SSL会降低性能。6)摘要式身份验证:增强了网络发送用户凭据的安全性。但是它依赖于HTTPI.1协议,并不是被所有的浏览器支持。7)集成Windows身份验证:这种方式是安全的。但它要求用户和Web服务器都在同一个域中。8)客户证书方式:这种方式使用SSL来传送客户证书,它需要每一个客户都具有一个证书。由于使用SSL,所以会对性能造成影响。
综观上述基于基础结构、认证和证书的安全技术都或多或少存在一些局限性,它们都依赖于操作系统和HTTP协议。SOAP是一种消息格式,在现实环境中可能要穿越多种不同的协议,为了保证消息只能被发送者和接收者阅读,本文在结合WS-Security[4]规范基础上,给出一种使用DES[5]和RSA[6]技术的Web服务安全策略。
1 工作原理
SOAP规范允许在SOAP消息的头消息之中传输SOAP消息的元数据。根据这一特性,结合WS-Security规范,给出本文基于加密技术的Web服务安全方法的原理。
具体原理是:在客户应用端随机产生DES密钥,在它与Web服务端之间传递的需加密的信息,用DES进行加密和解密;在Web服务端随机产生RSA密钥对,用公钥来加密DES密码,以便在Web服务端获取客户应用端的DES密码;通过定义包含Web服务端RSA公钥、用RSA加密的客户应用端DES密码和需要加密的信息的SOAP头数据结构(类),在Web服务端和客户应用端之间传递SAOP头对象,实现信息安全传递过程的目的。
2 Web服务安全模型
根据上述原理,本文给出了一种基于加密技术的Web服务安全模型,如图1所示。
图1 基于加密技术Web服务的安全模型
当客户应用需使用Web服务时,首先随机产生DES密码,其次,从Web服务端获取SOAP头对象(在每次获取SOAP头对象时,Web服务端都会随机产生一对RSA密钥对),用SAOP头对象中RSA公钥加密DES密钥,用DES密钥加密需加密信息,并把这些加密信息存入SOAP头对象中,再次,把SOAP头对象传递到Web服务应用端,用RSA私钥解密SOAP中已加密DES密钥,这样,就可以在Web服务应用端用DES密钥解密客户应用传递加密的信息和加密需传递给客户应用的信息。
3 安全策略实证
为了验证本文给出的安全策略,我们设计一个示例。即从客户应用端传一个数据,通过DES加密后传递到Web服务端,在Web服务端用DES解密后,然后,再用DES加密并传递到客户应用端,在客户应用端用DES解密后与原数据比较是否一致。在这个过程中,客户应用端与Web服务端之间传递的数据和DES密钥是加密,且是一个来回一次密。我们用C#.net书写代码,用System.Security.Cryptography[5]创建DES和RSA密码,关键代码如下:
3.1 用户用户信息头类(UserInfo)定义
public class UserInfo: System.Web.Services.Protocols.SoapHeader
{public byte[] name; //加密信息
public string RSAPublicKey; //RSA公钥public byte[] DESKey; //加密的DESKey向量public byte[] DESIV; //加密的DESIV向量}
3.2 web服务端关键代码
web服务端负责随机产生RSA密钥,web服务“getUserInfo”,它的功能是解密DES密钥、已加密数据和用DES加密要回传给客户端的数据,关键代码如下:
public UserInfo uinfo;
//产生RSA加密对象,也就随机产生了RSA密钥对
RSACryptoServiceProvider rsa;
uinfo.RSAPublicKey = rsa.ToXmlString(true);
[WebMethod] public string getUserInfo(UserInfo uinfo)
{…
RSACryptoServiceProvider rsa;
DESCryptoServiceProvider des;
//用XML字符串还原RDS解密对象
rsa.FromXmlString(uinfo.RSAPublicKey);
//用RSA私钥解密头对象中已加密DES的向量
byte[]_DESKey=rsa.Decrypt(uinfo.DESKey,false);
byte[]_DESIV=rsa.Decrypt(uinfo.DESKey,false);
//用解密的KEY和IV向量对当前DES对象赋值
des.Key=_DESKey; des.IV=_DESIV;
//对加密信息进行解密
ICryptoTransform ict=des.CreateDecryptor();
byte[] ret=ict.TransformFinalBlock();
3.3 客户应用端关键代码
demo.Service aa=new Service();
//获取SOAP头对象实例
demo.UserInfo uu=aa.getSOAPHeader();
//还原Web Services服务器端的RSA对象
RSACryptoServiceProvider rsa;
rsa.FromXmlString(uu.RSAPublicKey);
//定义DES加密对象,获取DES密钥
DESCryptoServiceProvider des;
des.GenerateKey();des.GenerateIV();
//用RSA加密DES密钥
uu.DESKey=rsa.Encrypt(des.Key, false);
uu.DESIV=rsa.Encrypt(des.IV, false);
//用DES密钥加密需传输的数据中
ICryptoTransform ict=des.CreateEncryptor();
uu.name=ict.TransformFinalBlock();
//调用Web服务并获取返回值
aa.getUserInfo(uu);
//信息验证
…
我们在这里只演示了传递一个需加密的数据。如果读者要传递多个加密数据,只需要再扩充SOAP头的数据结构,至于解密和加密代码同上,受篇幅限制,不再赘述。
4 结束语
我们在普通PC机,Windows XP Professional操作系统,Visual Stdio2005开发环境,在IIS5.0服务器成功地运行了上述案例,验证了本文给出的安全方案是可行和有效的。
本文给出的Web服务安全方案结合了WS—Security规范,兼容性好;在客户应用与Web服务之间传递数据时,运用了混合加密方式且一次一密,安全系数很高;同时,该方案无需借用第三方组件,降低软件的开发成本。可以说本文的方案是一个有效,可行,低成本的且容易实现的方案。
[1] Web Services[EB/OL].http://www.webservices.org/index.php/article/articleview 2010-11-12.
[2] 顾宁, 刘家茂,柴晓路.Web Services原理与研发实践[M],北京: 机械工业出版社, 2006:155-175.
[3] 全立新.Web服务安全策略与技术探讨[J], 广州: 现代计算机, 2010(9): 104-107.
[4] WS-Security[EB/OL]. http://www.w3.org/standards/xml/security 2010-11-21.
[5] Cryptography[EB/OL]. http://msdn.microsoft.com/library/system. security. cryptography.aspx 2010-11-21.