全立新
(湖南財政經濟學院 信息管理系,長沙 410205)
Web服務[1]技術已成為新一代計算技術的導向,在電子商務、系統集成等多個領域發(fā)揮著日益重要的作業(yè)。然而作為一種新興技術,Web服務面臨著許多挑戰(zhàn)。Web服務同CORBA、COM+、RMI這些分布式對象系統相比,在安全、事務處理能力、可管理能力等方面有所欠缺,尤其安全問題亟待解決[2]。
考察現有的一些安全技術[3],1)防火墻:當用戶想要把訪問限定在一個專用網絡中的計算機上時,則可以使用防火墻技術,在一定程度上限制Web服務應用范圍;2)SSL(Secure Sockets Layer,安全套接字層):雖然SSL可以有效的建立安全的通信,但是它會對性能造成很大的影響。3)VPN(Virtual Private Networks,虛擬專用網絡):VPN可在共享的或公共的網絡中建立一個專用的網絡環(huán)境,是一種端到端的連接,但需要花費較長的時間建立連接。4)基本身份驗證:使用明文(采用Base64編碼)直接傳送用戶名和密碼,任何人都可以查看其內容,不太安全。5)SSL上的基本身份驗證:這種方式在安全的SSL連接中傳送用戶名和密碼,杜絕了密碼被截獲和破解的危險,它是安全的。但不足在于使用SSL會降低性能。6)摘要式身份驗證:增強了網絡發(fā)送用戶憑據的安全性。但是它依賴于HTTPI.1協議,并不是被所有的瀏覽器支持。7)集成Windows身份驗證:這種方式是安全的。但它要求用戶和Web服務器都在同一個域中。8)客戶證書方式:這種方式使用SSL來傳送客戶證書,它需要每一個客戶都具有一個證書。由于使用SSL,所以會對性能造成影響。
綜觀上述基于基礎結構、認證和證書的安全技術都或多或少存在一些局限性,它們都依賴于操作系統和HTTP協議。SOAP是一種消息格式,在現實環(huán)境中可能要穿越多種不同的協議,為了保證消息只能被發(fā)送者和接收者閱讀,本文在結合WS-Security[4]規(guī)范基礎上,給出一種使用DES[5]和RSA[6]技術的Web服務安全策略。
SOAP規(guī)范允許在SOAP消息的頭消息之中傳輸SOAP消息的元數據。根據這一特性,結合WS-Security規(guī)范,給出本文基于加密技術的Web服務安全方法的原理。
具體原理是:在客戶應用端隨機產生DES密鑰,在它與Web服務端之間傳遞的需加密的信息,用DES進行加密和解密;在Web服務端隨機產生RSA密鑰對,用公鑰來加密DES密碼,以便在Web服務端獲取客戶應用端的DES密碼;通過定義包含Web服務端RSA公鑰、用RSA加密的客戶應用端DES密碼和需要加密的信息的SOAP頭數據結構(類),在Web服務端和客戶應用端之間傳遞SAOP頭對象,實現信息安全傳遞過程的目的。
根據上述原理,本文給出了一種基于加密技術的Web服務安全模型,如圖1所示。
圖1 基于加密技術Web服務的安全模型
當客戶應用需使用Web服務時,首先隨機產生DES密碼,其次,從Web服務端獲取SOAP頭對象(在每次獲取SOAP頭對象時,Web服務端都會隨機產生一對RSA密鑰對),用SAOP頭對象中RSA公鑰加密DES密鑰,用DES密鑰加密需加密信息,并把這些加密信息存入SOAP頭對象中,再次,把SOAP頭對象傳遞到Web服務應用端,用RSA私鑰解密SOAP中已加密DES密鑰,這樣,就可以在Web服務應用端用DES密鑰解密客戶應用傳遞加密的信息和加密需傳遞給客戶應用的信息。
為了驗證本文給出的安全策略,我們設計一個示例。即從客戶應用端傳一個數據,通過DES加密后傳遞到Web服務端,在Web服務端用DES解密后,然后,再用DES加密并傳遞到客戶應用端,在客戶應用端用DES解密后與原數據比較是否一致。在這個過程中,客戶應用端與Web服務端之間傳遞的數據和DES密鑰是加密,且是一個來回一次密。我們用C#.net書寫代碼,用System.Security.Cryptography[5]創(chuàng)建DES和RSA密碼,關鍵代碼如下:
public class UserInfo: System.Web.Services.Protocols.SoapHeader
{public byte[] name; //加密信息
public string RSAPublicKey; //RSA公鑰public byte[] DESKey; //加密的DESKey向量public byte[] DESIV; //加密的DESIV向量}
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();
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頭的數據結構,至于解密和加密代碼同上,受篇幅限制,不再贅述。
我們在普通PC機,Windows XP Professional操作系統,Visual Stdio2005開發(fā)環(huán)境,在IIS5.0服務器成功地運行了上述案例,驗證了本文給出的安全方案是可行和有效的。
本文給出的Web服務安全方案結合了WS—Security規(guī)范,兼容性好;在客戶應用與Web服務之間傳遞數據時,運用了混合加密方式且一次一密,安全系數很高;同時,該方案無需借用第三方組件,降低軟件的開發(fā)成本。可以說本文的方案是一個有效,可行,低成本的且容易實現的方案。
[1] Web Services[EB/OL].http://www.webservices.org/index.php/article/articleview 2010-11-12.
[2] 顧寧, 劉家茂,柴曉路.Web Services原理與研發(fā)實踐[M],北京: 機械工業(yè)出版社, 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.