明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

使用WSE 加密SOAP報(bào)文(5)

[摘要]解密收到的報(bào)文不管是在客戶端還是在服務(wù)器端,WSE總是在SecurityInputFilter實(shí)現(xiàn)報(bào)文解密的,由于對稱加密需要由公共密鑰派生出來的加密密鑰,你需要?jiǎng)?chuàng)建一個(gè)SecurityInputF...
解密收到的報(bào)文

不管是在客戶端還是在服務(wù)器端,WSE總是在SecurityInputFilter實(shí)現(xiàn)報(bào)文解密的,由于對稱加密需要由公共密鑰派生出來的加密密鑰,你需要?jiǎng)?chuàng)建一個(gè)SecurityInputFilter能夠調(diào)用的方法來得到這個(gè)對稱密鑰,然后你就能使用包含在EncryptedData中的密鑰和算法信息來幫你找到正確的共享密鑰和加密算法了。這個(gè)方法必須實(shí)現(xiàn)在從Microsoft.Web.Services.Security.IDecryptionKeyProvider派生出來的類中。在我的例子中,DecryptionKeyProvider.GetDecryptionKey方法返回了對稱密鑰,如下:



public DecryptionKey GetDecryptionKey(string encAlgorithmUri,

KeyInfo keyInfo)

{



//重新創(chuàng)造同樣的用于表示128位密鑰的16個(gè)字節(jié)

byte[] keyBytes = {48, 218, 89, 25, 222, 209, 227, 51, 50, 168, 146,

188, 250, 166, 5, 206};





//重新創(chuàng)造表示初始化向量的8個(gè)字節(jié)(64位)

byte[] ivBytes = {16, 143, 111, 77, 233, 137, 12, 72};



SymmetricAlgorithm mySymAlg = new TripleDESCryptoServiceProvider();

mySymAlg.Key = keyBytes;

mySymAlg.IV = ivBytes;



//重新創(chuàng)建對稱加密密鑰

DecryptionKey myKey = new SymmetricDecryptionKey(mySymAlg);



return myKey;

}

即便在我的方法中并沒使用他們,WSE還是要把KeyInfo元素和加密算法的URI傳遞給這個(gè)方法的,決定使用哪一個(gè)共享密鑰或者加密算法來產(chǎn)生對稱密鑰



為了讓SecurityInputFilter能夠訪問到GetDecryptionKey方法,下面的配置信息必須加入到應(yīng)用程序的配置文件中(也就是 app.config 文件)



<configuration>

...

<microsoft.web.services>

<security>

<decryptionKeyProvider

type="MyClient Assembly.DecryptionKeyProvider,

MyClientAssembly" />

</security>

type 屬性不能有任何過多的空格或者任何換行。他們只包含上面的內(nèi)容以增強(qiáng)可讀性,這個(gè)也可一用WSE設(shè)置工具來修改。一旦DecryptionKeyProvider類被添加到客戶端而且WSE安全支持已經(jīng)配置好了,WSE將自動(dòng)攔截加密數(shù)據(jù),一個(gè)基于標(biāo)準(zhǔn)的Web服務(wù)的2次開發(fā)平臺程序,就可以讓你隨心所欲的給客戶端編程了。

使用 X.509 證書來給SOAP報(bào)文加密

正如我前面提到的,非對稱操作有一定開銷。當(dāng)傳輸大量數(shù)據(jù)時(shí),從性能上來說,用非對稱算法來加密這些數(shù)據(jù)會(huì)顯得不太實(shí)際,WSE就這個(gè)問題,實(shí)現(xiàn)了一種偽非對稱性加密(pseudo-asymmetric encryption)。和非對稱性加密的報(bào)文相比,WSE使用一個(gè)非對稱性算法和X.509證書的一個(gè)公開備份,以此來加密對稱密鑰,而實(shí)際上這些被用來給報(bào)文加密。當(dāng)收到報(bào)文后,SecurityInputFilter得到和X.509證書相關(guān)聯(lián)的私有密鑰,以此給對稱密鑰解密,然后用解密后的密鑰給報(bào)文正文解密。為了能讓這個(gè)例子能夠正常工作,一個(gè)來自受信任的證書認(rèn)證的X.509證書(支持加密),必須出現(xiàn)在客戶機(jī)器上當(dāng)前用戶帳號的個(gè)人證書儲藏室里面,這個(gè)證書的私有密鑰也必須出現(xiàn)在本地機(jī)器在主管Web服務(wù)的服務(wù)器的帳號里。另外,CA證書鏈中的一個(gè)證書必須出現(xiàn)在客戶端的受信任儲存室里,那樣WSE才知道可以信任接受到的X.509證書。