前言:
本文包括如下内容:
1、Cryptography Application Block 的简单介绍(参考了自带的英文文档)
2、配置Cryptography Application Block(本文以配置Symmetric Encryption Provider为例,Hash Provider 的配置基本相似)
3、怎样对一个数据进行加密?
4、数据解密
5、如何得到数据的Hash值
6、根据数据Hash值来判断数据是否变化
第一部分:Crytography Application Block 简介
Crytography Application Block 提供了两种加密方法: Hash 和 Symmetric ,二者的区别是,Hash加密算法是不可以解密的,而Symmetric既可加密又可以解密。当然它也支持自定义的加密方法,Enterprise Library 2.0提供了对加密算法的修改和扩展功能。
一、什么时候需要使用Cryptography Application Block?
当我们的应用程序需要用到Hash 或 Symmetric 加密时,我们可以考虑使用它,我们可以使用微软提供的加密算法,也可以自己定义需要的加密算法。当我们的数据只需要对其进行加密,并且不会用到解密方法时,我们可以使用Hash Provider(比如说我们对密码进行加密就可采用此种方法),当数据既需要加密又需要解密的时候,我们可以使用Symmetric Encryption Provider(比如我们在页面间通过Url传递一些敏感参数时可以考虑使用此种方法对数据进行加密)。
二、Crytography Application Block 给我们开发人员带来了什么好处?
1、它帮助我们开发人员很轻松的解决应用程序中的加密问题。
2、它可以帮助我们统一整个企业的应用程序的统一性。
3、Crytography Application Block是可扩展的,我们可以用自己写的加密算法来对应用程序进行加密。
第二部分:Crytography Application Block 配置
首先我们打开Enterprise Library Configuration,它存在与你的Enterprise Library安装目录下的bin目录中。当然在此之前我们需要先建好我们的项目,并添加App.Config文件,我后面的例子都是在VS2005的Test Project 中进行的。
选择 File --> Open Application ,如下:
此时选择我们刚建的项目中的App.Config文件,如图:
然后,右键单击 Application --> New --> Crytography Application Block,如图:
因为我们要配置的是Symmetric Encryption ,所以接下来我们选择Symmetric Provider并右击,如下:
此时新建一个Symmetric Algorithm Provider ,并选择一种加密算法,如下图:
之后出现 Cryptographic Key Wizard 的对话框,如下:
我们选择Create a new Key,这时候就出现了让我们输入类似注册码之类的对话框(这一处输入的十六进制数我还没搞懂有什么作用),我们点Generate,如下:
然后点 Next,选择我们建立的Key File的保存路径,如下:
再Next一下,这时让我们选择加密的模式,如下:
加密模式有两种,User mode 和 Machine mode
使用Machine mode的情况:
1、当你的应用程序运行在专门的服务器上,并且这台服务器上没有其他的应用程序;
2、你的服务器上同时运行了多个应用程序,你希望这些应用程序能够共享一些敏感的信息。
使用User mode的情况:
如果你的应用程序运行在多程序的环境下,但你不希望你的应用程序中的敏感数据受到其他应用程序的影响或被其他应用程序访问;在这种情况下,每个应用程序的资源(例如:文件、数据库等)之间都是相互独立,互不影响的。
注意:如果你选择了DPAPI加密算法,然后再使用machine mode的话,那么加密后的数据只在当前的机器上有效,所以你必须为每台机器生成一个加密的数据。
然后点 Finish ,这时可以修改我们的 Cryptography Application Block 的配置名.
然后点File-->Save All,这样我们就完成了一个Symmetric Provider 的配置。此时我们的配置文件就会增加如下内容,当然这些内容我们也可以手工去添加。
< configuration >
< configSections >
< section name ="securityCryptographyConfiguration" type ="Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.Configuration.CryptographySettings, Microsoft.Practices.EnterpriseLibrary.Security.Cryptography, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" />
</ configSections >
< securityCryptographyConfiguration >
< symmetricCryptoProviders >
< add algorithmType ="System.Security.Cryptography.DESCryptoServiceProvider, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
protectedKeyFilename ="E:/研究中/Enterprise Library 2/Enterprise Library 2/key.key"
protectedKeyProtectionScope ="CurrentUser" type ="Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.SymmetricAlgorithmProvider, Microsoft.Practices.EnterpriseLibrary.Security.Cryptography, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
name ="MyCryptographyProvider" />
</ symmetricCryptoProviders >
</ securityCryptographyConfiguration >
</ configuration >
第三部分:使用Cryptography Application Block
这一部分介绍了使用Cryptography Application Block对数据进行加密与解密等操作。
1、加密与解密操作
public void UseCryptography()
{
//加密
string name = Cryptographer.EncryptSymmetric("MyCryptographyProvider", "SHY520");
//解密
string rname = Cryptographer.DecryptSymmetric("MyCryptographyProvider", name);
Assert.AreEqual(rname,"SHY520");
}
2、得到数据的Hash值,前提是我们要配置一个Hash Provider(具体的配置方法可以参考前面介绍的Symmetric Provider的配置方法),然后用如下方法得到Hash值,但是要注意,Hash值不可以解密。
public void GetHashValues()
{
byte[] valueToHash = (new UnicodeEncoding()).GetBytes("password");
byte[] generatedHash = Cryptographer.CreateHash("hashProvider", valueToHash);
// Clear the byte array memory.
Array.Clear(valueToHash, 0, valueToHash.Length);
Assert.AreEqual("password",generatedHash);
}
当然,上面这个测试方法是肯定通过不了的。这里只是说明如何取得数据的Hash值。
3、通过比较一个数据和它已经生成的一个Hash值,来判断数据是否发生改变。
public void CompareHashValue()
{
byte[] ovalue = (new UnicodeEncoding()).GetBytes("SHY520");
//创建ovalue的Hash值
byte[] generatedHash = Cryptographer.CreateHash("hashProvider", ovalue);
//比较数据和它的Hash值,如果数据没有改变则返回true,改变了就返回false
bool result = Cryptographer.CompareHash("hashProvider", ovalue, generatedHash);
//改变原来数据的值,再进行比较
ovalue = (new UnicodeEncoding()).GetBytes("SHY521");
bool result1 = Cryptographer.CompareHash("hashProvider", ovalue, generatedHash);
Assert.AreEqual(false,result1);
Assert.AreEqual(true, result);
}
Cryptography Application Block 中包含的内容也不是很多,但是它其中包含了很多常见的加密算法,足以满足我们项目中的要求,今天我们对Cryptography Application Block的介绍就到此为止,希望对初学者有所帮助。
上一篇: Enterprise Library 2.0 -- Caching Application Block
补充:
加密Config文件:
首先,添加对System.Configuration.dll的引用
然后添加下面的代码:
Configuration config = null;
config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
ConfigurationSection section = config.ConnectionStrings;
if (section.SectionInformation.IsProtected == false && section.ElementInformation.IsLocked == false)
{
section.SectionInformation.ProtectSection("RsaProtectedConfigurationProvider");
section.SectionInformation.ForceSave = true;
config.Save(ConfigurationSaveMode.Full);
}