Enterprise Library - Cryptography Application Block 学习手册(最新版) Part 1
本系列文章演示如何保护非配置文件中的信息,这里以一个模拟及时通讯(Instant Messenger)应用程序为例,升级应用程序以加密的消息,而不是明文消息来进行交谈。
练习一:加密和解密数据信息
首先打开ex01\begin 目录下的ChatterBox.sln 项目文件。
范例应用程序简要描述
1. 以设计模式方式打开项目文件中的Chat.cs文件,如下图所示。
该窗体用来发送和接收及时谈话信息,上面的文本框用来显示交谈记录,下面的文本框用来发送新的信息。
2. 运行范例程序,将打开2个窗口(一个是Sam,另一个是Toby)。
可以在这两个窗口之间传递消息。选择Tody 窗口,在Toby Says 对话框输入消息,然后点击Send按钮。同样的在Sam窗口进行相同操作。
同时也会显示一个Console窗口,该窗口作为对话监视器,每一个消息都将在Console窗口显示。
在两个窗口之间传递的消息为明文。下面将使用Cryptography Application Block的对称密钥(Symmetric Key)来加密和解密这些对话信息。
添加加密和解密
1. 为项目添加如下程序集
Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.dll
2. 打开Chat.cs代码文件,添加对如下命名空间的引用。
using Microsoft.Practices.EnterpriseLibrary.Security.Cryptography;
3. 添加如下代码到Chat类中(红色粗体显示)
public partial class Chat : Form
{
// TODO: Configuration symmetric algorithm provider name
private const string symmProvider = "ChatProvider";
. . .
}
上述常量必须匹配一个命名的对称加密提供者(Symmetric Cryptography Provider),本文后面部分会介绍,在App.config配置文件中symmetricCryptoProviders节。
4. 修改SendMessage方法,使用Cryptographer加密消息(红色粗体显示)
private void SendMessage(string message)
{
// TODO: Encrypt message
string encrypted = Cryptographer.EncryptSymmetric(symmProvider, message);
// Raise SendingMessage Event
if (this.SendingMessage != null)
this.SendingMessage(new MessageEventArgs(this._name, encrypted));
}
5. 修改MessageReceived方法,使用Cryptographer方法解密消息(红色粗体显示)
private void MessageReceived(MessageEventArgs args)
{
string message = args.Message;
// TODO: Decrypt message
string plainText = Cryptographer.DecryptSymmetric(symmProvider, message);
this.txtMessages.AppendText(
args.Sender + " says: " + plainText + Environment.NewLine);
}
修改应用程序配置文件
1. 对应用程序添加app.config配置文件,并使用Enterprise Library 配置工具打开app.config配置文件,添加Cryptography Application Block配置项,如下图所示。
2. 选择 Cryptography Application Block | Symmetric Providers 节点,接着点击New | Symmetric Algorithm Provider 菜单项,如下图所示。
随即弹出Type Selector 对话框,如下图所示。选择 RijndaelManaged类型,点击 OK 按钮。
如果加密算法被破解或者易于受到攻击,则加密算法没有安全性。如果定制的算法没有经过测试验证,一般不太安全。因此,我们选择经过已公开的、众所周知的、且经受住多年攻击的加密算法。
随着计算能力的提高,推荐的密钥长度也发生变化。目前,加密密钥长度在128位到256位认为是安全的。大多数现代的算法使用至少128位长的密钥。
对称加密算法-AES,也称为Rijndael,推荐使用。该算法支持的密钥长度为128、192、和256位。DES算法不推荐使用。
3. 在Cryptographic Key 向导对话框中,选择Create a new key 选项,然后点击Next按钮,如下图所示。
该向导将引导创建和保护加密密钥。点击Generate 按钮创建一个新的密钥,然后点击Next 按钮,如下图所示。
在下一步保存加密文件的对话框中,将文件保存在本地的任何一个地方(你可以考虑保存在桌面),然后点击Next按钮,如下图所示。
在向导的最后一步,选择User mode 或者 Machine mode模式,点击Finish 按钮,如下图所示。
在创建密钥时,你可选择Machine mode 或者 User mode。
Machine mode一般在如下情况下使用:
(1)你的应用程序运行在自己的特定服务器上,且没有其他的应用程序。
(2)你有多个应用程序运行在相同的服务器上,你希望这些应用程序能够共享敏感信息。
User mode则一般在如下情况下采用:
在共享的环境运行应用程序,但确保Server上其他应用程序不能访问该应用程序的敏感信息。在这种情况下,每个应用程序都在隔离的环境下运行,且应用程序的资源,如文件和数据库等等,都限制只有应用程序自身才可以访问。
4. 选择Cryptography Application Block | Symmetric Providers | RijndaelManaged 节点,设置如下属性: Name = ChatProvider
ChatProvider是对称加密提供者的名称,在前面的代码中有使用到。
最后,记得要保存好配置文件。
运行应用程序
在Toby和Sam之间传递消息,在Console窗口发现消息已经加密了,但是在接收端,正确解密出明文信息。
你或许会注意到在使用Cryptographer之后,应用程序会有些不稳定(如发生空白消息)。通常,我们需要在加密或解密字符串之前,需要添加一些代码进行检查。如,在SendMessage和MessageReceived方法中,检查字符串的长度是否为0。在MessageReceived方法,对解密的字符串,还需要检查长度是否为4个字节的整数倍,且仅含有有效Base64字符。这里为了简便,忽略了这些。
添加错误处理
处理异常最好的办法是确保在最前面的地方添加检查代码,确保异常不要发生。首先,确保不要加密0长度的字符串。在项目Chat.cs文件中的SendMessage方法,添加如下代码。
private void SendMessage(string message)
{
if ((message != null) && (message.Trim().Length > 0))
{
// TODO: Encrypt message
string encrypted = Cryptographer.EncryptSymmetric(symmProvider, message);
// Fire SendingMessage Event
if (this.SendingMessage != null)
this.SendingMessage(new MessageEventArgs(this._name, encrypted));
}
}
参考文档:
Cryptography Application Block Hands-On Labs for Enterprise Library