Enterprise Library - Cryptography Application Block 学习手册(最新版) Part 2

Enterprise Library - Cryptography Application Block 学习手册(最新版) Part 2
 
本文继续Cryptography Application Block的学习,演示使用单向哈希算法(one-way hashing algorithm)加密存储在XML文件中的密码。本文由http://blog.entlib.com 开源ASP.NET博客平台小组根据EntLib HOL手册编译提供,欢迎交流。
 
练习二:使用HashProvider存储单向哈希密码
首先打开ex02\begin 目录下的UserUI.sln 项目文件,该应用程序提供了管理XML配置文件中的用户名和密码。
 
范例应用程序简要描述
1. 运行范例程序,输入用户名Elmo,并保持默认的密码(P@ssw0rd)不变,点击OK按钮。
 
 
 
添加一个新的用户Zoe,重复上面的步骤。点击Save按钮,将保存上述信息到UserStore.config文件中。
 
2. 关闭应用程序,在Visual Studio 中打开UserStore.config配置文件,你会发现password以明文的形式保存在配置文件中。
<?xmlversion="1.0"encoding="utf-8"?>
<configuration>
    <configSections>
        <sectionname="userStore"type="UserStore.Configuration.UserSettings, UserStore, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
    </configSections>
    <userStore>
        <users>
            <addname="EntLib.com"password="P@ssw0rd" />
            <addname="Forum"password="P@ssw0rd" />
        </users>
    </userStore>
</configuration>
 
使用前一节的对称加密密钥对密码进行加密并不是一个好的方法,因为会影响密码的安全性。一般采用单向哈希算法,在和已存储的哈希密码(一般存储在数据库中)进行比较之前,先对输入的密码进行哈希。在这种情况下,即使数据库泄漏,密码仍然是安全的。
在进行哈希算法之前,对密码添加额外的Salt,使得密码更难以破解。
 
配置Hash Provider
1. 使用Enterprise Library的配置管理工具打开项目中的app.config配置文件。配置文件已经定义了2个配置源(Configuration Source),应用程序使用Enterprise Library 中配置的封装类来管理UserStore.config的位置和内容,如下图所示。
 
 
2. 右键点击应用程序配置文件,选择New | Cryptography Application Block,为配置文件添加Cryptography application block的配置节点。
 
 
3. 选择Cryptography Application Block | Hash Providers 节点,添加 New | HashAlgorithm Provider,创建一个新的HashAlgorithm提供者。
 
 
4. 在弹出的Type Selector 对话框中,选择SHA1Managed类型,然后点击OK按钮。
 
 
对于哈希算法,推荐使用SHA256Managed算法,该使用使用256位的哈希大小,而SHA1Managed哈希算法是160位,该算法也可以接受。MD4和MD5算法则不再推荐使用。
 
5. 选择Cryptography Application Block | Hash Providers | SHA1Managed节点,设置如下属性:
Name = PasswordHasher
SaltEnabled = True
最后,保存好配置文件。
 
使用哈希算法
1. 选择Solution Provider中的UserStore项目,添加对Cryptography.dll程序集的引用。
Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.dll
 
2. 打开Security | HashHelper.cs文件(在UserStore项目中),添加如下命名空间的引用:
using Microsoft.Practices.EnterpriseLibrary.Security.Cryptography;
 
3. 打开HashProvider类,添加如下代码:
class HashHelper
{
    private HashHelper() { }
 
    // TODO: Hash provider name must match app.config
    private const string hashProvider = "PasswordHasher";
 
    . . .
}
常量值必须匹配app.config配置文件中已命名的hash provider。
 
4. 修改CreateHash方法,如下所示。
public static string CreateHash(string plainText)
{
    string hash = null;
 
    // TODO: Hash the plain text
    hash = Cryptographer.CreateHash(hashProvider, plainText);
 
    return hash;
}
在内存中的敏感数据需要尽快清除。在内存中的未加密数据存在安全风险。需要了解的是在内存中的数据也有可能写到硬盘上,因此操作系统可能将数据写到交换文件上。此外,如果系统崩溃,操作系统也会将内存中的数据写到硬盘上。
 
5. 运行范例程序,重置Elmo的密码,点击Reset Password按钮,保留默认的密码(P@ssw0rd),然后点击OK按钮。UserStore.config配置文件中,当前明文保存的密码信息将替换为密码的哈希值。
 
 
6. 对用户Zoe也采用相同的步骤。
7. 点击Save按钮,保存对UserStore.config的修改。
8. 尝试更改Elmo的密码。点击Change Password按钮,输入默认的旧密码P@ssw0rd,然后数据新的密码,如EntLib,点击OK按钮。但是,此时会发生验证现有密码失败。为什么呢?看看后面的解释。
 
 
9. 点击Close按钮,关闭应用程序。
10. 在Visual Stuido中打开UserStore.config文件,发现密码都已经哈希了。
<?xmlversion="1.0"encoding="utf-8"?>
<configuration>
    <configSections>
        <sectionname="userStore"type="UserStore.Configuration.UserSettings, UserStore, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
    </configSections>
    <userStore>
        <users>
            <addname="EntLib.com"password="3kHeDQo7uDI6Pj7890is1EiNGGjBB6ImxpB5LJkCFV+hY3Kp" />
            <addname="Forum"password="SBRc6JsFweEbxRfBStukevhur7RB3GpqaPLJRVymuK5WZ0e9" />
        </users>
    </userStore>
</configuration>
 
注意每种情况下,哈希值是不同的,即使实际的密码是相同的,这是因为额外的Salt。因此为了验证密码的有效性,我们不能简单应用对明文密码进行哈希计算,然后比较2个哈希字符串。
11. 打开Security | HashHelper.cs文件(在UserStore项目中),修改CompareHash方法中的如下代码。
        public static bool CompareHash(string plainText, string hashedText)
        {
            bool compare = false;
 
            compare = Cryptographer.CompareHash(hashProvider, plainText, hashedText);
 
            return compare;
        }
 
12. 再次运行应用程序,修改Elmo的密码 – 点击Change Password按钮,这次一定会成功。
http://www.entlib.com专业ASP.NET电子商务平台小组,欢迎你继续访问Cryptography  Application Block学习手册。
 
参考文档:
Cryptography Application Block Hands-On Labs for Enterprise Library
 

 

posted @ 2009年10月11日 10:52 | entlibforum 阅读 (0) | 评论 (3)

Enterprise Library - Cryptography Application Block 学习手册(最新版) Part 1

Enterprise Library - Cryptography Application Block 学习手册(最新版) Part 1
 
本系列文章演示如何保护非配置文件中的信息,这里以一个模拟及时通讯(Instant Messenger)应用程序为例,升级应用程序以加密的消息,而不是明文消息来进行交谈。
本文由http://blog.entlib.com 开源ASP.NET博客平台小组根据EntLib HOL手册编译提供,欢迎交流。
 
练习一:加密和解密数据信息
首先打开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));
            }
        }
 
http://www.entlib.com专业ASP.NET电子商务平台小组,欢迎你继续访问Cryptography  Application Block学习手册。
 
参考文档:
Cryptography Application Block Hands-On Labs for Enterprise Library
 

 

posted @ 2009年10月11日 0:29 | entlibforum 阅读 (0) | 评论 (0)
«十月»
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567