解密收到的報文
不管是在客戶端還是在服務器端,WSE總是在SecurityInputFilter實現報文解密的,由于對稱加密需要由公共密鑰派生出來的加密密鑰,你需要創建一個SecurityInputFilter能夠調用的方法來得到這個對稱密鑰,然后你就能使用包含在EncryptedData中的密鑰和算法信息來幫你找到正確的共享密鑰和加密算法了。這個方法必須實現在從Microsoft.Web.Services.Security.IDecryptionKeyProvider派生出來的類中。在我的例子中,DecryptionKeyProvider.GetDecryptionKey方法返回了對稱密鑰,如下:
public DecryptionKey GetDecryptionKey(string encAlgorithmUri,
KeyInfo keyInfo)
{
//重新創造同樣的用于表示128位密鑰的16個字節
byte[] keyBytes = {48, 218, 89, 25, 222, 209, 227, 51, 50, 168, 146,
188, 250, 166, 5, 206};
//重新創造表示初始化向量的8個字節(64位)
byte[] ivBytes = {16, 143, 111, 77, 233, 137, 12, 72};
SymmetricAlgorithm mySymAlg = new TripleDESCryptoServiceProvider();
mySymAlg.Key = keyBytes;
mySymAlg.IV = ivBytes;
//重新創建對稱加密密鑰
DecryptionKey myKey = new SymmetricDecryptionKey(mySymAlg);
return myKey;
}
即便在我的方法中并沒使用他們,WSE還是要把KeyInfo元素和加密算法的URI傳遞給這個方法的,決定使用哪一個共享密鑰或者加密算法來產生對稱密鑰
為了讓SecurityInputFilter能夠訪問到GetDecryptionKey方法,下面的配置信息必須加入到應用程序的配置文件中(也就是 app.config 文件)
<configuration>
...
<microsoft.web.services>
<security>
<decryptionKeyProvider
type="MyClient Assembly.DecryptionKeyProvider,
MyClientAssembly" />
</security>
type 屬性不能有任何過多的空格或者任何換行。他們只包含上面的內容以增強可讀性,這個也可一用WSE設置工具來修改。一旦DecryptionKeyProvider類被添加到客戶端而且WSE安全支持已經配置好了,WSE將自動攔截加密數據,一個基于標準的Web服務的2次開發平臺程序,就可以讓你隨心所欲的給客戶端編程了。
使用 X.509 證書來給SOAP報文加密
正如我前面提到的,非對稱操作有一定開銷。當傳輸大量數據時,從性能上來說,用非對稱算法來加密這些數據會顯得不太實際,WSE就這個問題,實現了一種偽非對稱性加密(pseudo-asymmetric encryption)。和非對稱性加密的報文相比,WSE使用一個非對稱性算法和X.509證書的一個公開備份,以此來加密對稱密鑰,而實際上這些被用來給報文加密。當收到報文后,SecurityInputFilter得到和X.509證書相關聯的私有密鑰,以此給對稱密鑰解密,然后用解密后的密鑰給報文正文解密。為了能讓這個例子能夠正常工作,一個來自受信任的證書認證的X.509證書(支持加密),必須出現在客戶機器上當前用戶帳號的個人證書儲藏室里面,這個證書的私有密鑰也必須出現在本地機器在主管Web服務的服務器的帳號里。另外,CA證書鏈中的一個證書必須出現在客戶端的受信任儲存室里,那樣WSE才知道可以信任接受到的X.509證書。
|