2008年10月24日星期五

Ingrian手记——CryptoUtility使用说明(基础)

CryptoUtility是一个封装了Ingrian客户端组件的DLL,使.NET程序可以更方便的调用Ingrian来做加解密。下面让我们来看看如何使用这个DLL。

首先我们创建一个.NET项目,是Console,是Windows或是Web的都可以,这里我们以一个Console程序为例。创建好后我们将CryptoUtility.dll这个程序集引用到我们的Console程序中来,如图:

CryptoUtility_Reference 

接下来我们来看一段代码:

   1: using System;
   2: using Newegg.CryptoUtility;
   3:  
   4: namespace CryptoUtilityDemo
   5: {
   6:     class Program
   7:     {
   8:         static void Main(string[] args)
   9:         {
  10:             Console.WriteLine("Write something:");
  11:             string something = Console.ReadLine();
  12:  
  13:             using (ICrypto crypto = new CryptoSession())
  14:             {
  15:                 string encryptedText = crypto.Encrypt(something);
  16:  
  17:                 Console.WriteLine("Encrypted text is: {0}", encryptedText);
  18:  
  19:                 string decryptedText = crypto.Decrypt(encryptedText);
  20:  
  21:                 Console.WriteLine("Decrypted text is: {0}", decryptedText);
  22:             }
  23:  
  24:             Console.ReadKey();
  25:         }
  26:     }
  27: }

这段代码演示的是一个很简单的场景,让用户输入一段文字,然后创建一个CryptoSession对象来加密这段文字,之后再解密加密后的文字,再将CryptoSession对象Dispose掉。正如你看到的,CryptoUtility组件的使用是非常简单的。不过光有这段代码程序还跑不起来,这是因为Ingrian需要一个帐号连接到它的服务器上,并且我们还要提供一个key name才能够进行加密或解密等操作。CryptoSession的默认构造函数会自动从App.config或Web.config中读取这些信息,所以我们可以添加一个App.config或Web.config来指定这些信息,如下:

   1: <?xml version="1.0" encoding="utf-8" ?>
   2: <configuration>
   3:   <appSettings>
   4:     <add key="ingrian.userName" value="sampleUser"/>
   5:     <add key="ingrian.password" value="samplePassword"/>
   6:   </appSettings>
   7: </configuration>

上面配置中被划掉的部分就是连接Ingrian服务器所需的用户名和密码了,可以看到这里我们并没有指定key name,这是因为如果我们不指定的话CryptoUtility会自动帮我们找出合适的key用来加解密,这也是一般我们提倡的做法。也许你会问,“那么在解密的时候CryptoUtility怎么知道我该用哪个key解密呢?”,答案是CryptoUtility足够聪明,它确实能够知道该用什么key来解密,我们在使用它时就不用关心这个问题了。

另外虽然没有在上面的代码片段中体现出,但是无论是在CryptoSession Open时,还是在加做解密动作时,都有可能会有异常抛出,例如连接不上Ingrian服务器就会抛出CryptoConnectionException,在加解密时出错就会抛出CryptoException等。如何根据需要在你的代码中捕获这些异常就要看你的了。下面给出一段异常处理的代码片段:

   1: private static void HandleExceptionCase()
   2: {
   3:     ICrypto crypto = new CryptoSession();
   4:  
   5:     try
   6:     {
   7:         crypto.Open();
   8:  
   9:         string encryptedText = crypto.Encrypt("123");
  10:         string decryptedText = crypto.Decrypt(encryptedText);
  11:  
  12:         //TODO
  13:     }
  14:     catch (CryptoConnectionException)
  15:     {
  16:         //Handle connection problems.
  17:     }
  18:     catch (CryptoKeyException)
  19:     {
  20:         //Handle key problems.
  21:     }
  22:     catch (CryptoException)
  23:     {
  24:         //Handle other problems.
  25:     }
  26:     finally
  27:     {
  28:         crypto.Close();
  29:     }
  30: }

可以看出对于CryptoSession对象的异常处理方式和SqlConnection之类的对象是一样的。也就是,平时不捕捉异常时也要养成使用C#关键字using的好习惯。但如果由于性能原因需要保留CryptoSession对象的话千万别忘了在用完之后将其Close(或Dispose)掉,这一点与SqlConnection之类对象的注意事项是一样的。

好了,以上就是CryptoUtility的基本使用方法,相信它已经足够应付绝大部分的应用场景了。在高阶篇中我会讲到一些CryptoUtility组件的高级使用方法,当这种简单的使用方法不能满足你的需求时就可以去看看了。

没有评论:

发表评论