利用WSE 加密SOAP报文(5)

** 解密收到的报文 ** ** **

不管是在客户端还是在服务器端, 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 文件)

 1<configuration>
 2
 3... 
 4
 5<microsoft.web.services>
 6<security>
 7<decryptionkeyprovider type="MyClient Assembly.DecryptionKeyProvider, 
 8
 9MyClientAssembly"></decryptionkeyprovider>
10</security>
11
12type  属性不能有任何过多的空格或者任何换行。他们只包含上面的内容以增强可读性,这个也可一用  WSE  设置工具来修改。一旦  ** DecryptionKeyProvider  ** 类被添加到客户端而且  WSE  安全支持已经配置好了,  WSE  将自动拦截加密数据,一个  基于标准的Web服务的2次开发平台程序  ,就可以让你随心所欲的给客户端编程了。 
13
14** 使用  ** ** X.509  ** ** 证书来给  ** ** SOAP  ** ** 报文加密  ** ** **
15
16正如我前面提到的,非对称操作有一定开销。当传输大量数据时,从性能上来说,用非对称算法来加密这些数据会显得不太实际,  WSE  就这个问题,实现了一种伪非对称性加密(  pseudo-asymmetric encryption  )。和非对称性加密的报文相比,  WSE  使用一个非对称性算法和  X.509  证书的一个公开备份,以此来加密对称密钥,而实际上这些被用来给报文加密。当收到报文后,  ** SecurityInputFilter  ** 得到和  X.509  证书相关联的私有密钥,以此给对称密钥解密,然后用解密后的密钥给报文正文解密。为了能让这个例子能够正常工作,一个来自受信任的证书认证的  X.509  证书(支持加密),必须出现在客户机器上当前用户帐号的 **个人** 证书储藏室里面,这个证书的私有密钥也必须出现在本地机器在主管  Web  服务的服务器的帐号里。另外,  CA  证书链中的一个证书必须出现在客户端的受信任储存室里,那样  WSE  才知道可以信任接受到的  X.509  证书。</microsoft.web.services></configuration>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus