以下摘自MS文檔
构建安全的 ASP.NET 应用程序
身份验证、授权和安全通信
有关构建安全的 ASP.NET 应用程序 的起点和完整概述,请参见登陆页面。
总结
本“如何做”介绍如何在 ASP.NET Web 应用程序或 Web 服务中使用 DPAPI 以加密敏感的数据。
如何做:在 ASP.NET 中使用 DPAPI(机器存储)
Web 应用程序经常需要在应用程序配置文件中存储与安全性相关的数据,如数据库连接字符串和服务帐户凭据。出于安全性考虑,这种类型的信息决不要以纯文本形式存储,而一定要在加密后存储。
本“如何做”介绍如何在 ASP.NET 中使用 DPAPI。它包括 ASP.NET Web 应用程序、Web 服务以及 ASP.NET 中托管的 .NET 远程处理组件。
此“如何做”中的代码通过托管类库引用 DPAPI,本指南“参考”部分中的“如何做:创建 DPAPI 库”介绍了如何创建该类库。
备注
● DPAPI 能够与机器存储或用户存储(需要一个已加载的用户配置文件)配合使用。DPAPI 默认情况下用于用户存储,但您可以通过将 CRYPTPROTECT_LOCAL_MACHINE 标志传递给 DPAPI 函数来指定使用机器存储。
● 这种用户配置文件方式提供了一个额外的安全层,因为它限制了哪些用户能访问机密内容。只有加密该数据的用户才能解密该数据。但是,当通过 ASP.NET Web 应用程序使用 DPAPI 时,使用用户配置文件需要您执行额外的开发工作,因为您需要采取明确的步骤来加载和卸载用户配置文件(ASP.NET 不会自动加载用户配置文件)。
● 机器存储方式(本“如何做”中采用的)更容易开发,因为它不需要用户配置文件管理。但是,除非使用一个附加的熵参数,否则并不安全,因为该计算机的任何用户都可以解密数据。(熵是一个设计用来使解密机密内容更为困难的随机值)。使用附加的熵参数出现的问题在于它必须由应用程序安全地存储起来,这带来了另一个密钥管理问题。
● 有关介绍如何在 ASP.NET Web 应用程序中结合使用 DPAPI 和用户存储(通过使用企业服务应用程序中的服务组件)的文章,请参见本指南“参考”部分中“如何做:在具有企业服务的 ASP.NET 中使用 DPAPI(用户存储)”。
需求
以下各项介绍了推荐的硬件、软件、网络基础结构、技巧和知识以及您需要的服务包。
● Microsoft® Windows® 2000 操作系统
● Microsoft Visual Studio® .NET 开发系统
本“如何做”中的过程还要求您具备使用 Microsoft Visual C#™ 开发工具构建 ASP.NET Web 应用程序的相关知识。
在执行本“如何做”中的步骤之前,必须先执行“如何做:创建 DPAPI 库”中介绍的步骤,以便创建本“如何做”中的代码所使用的 DPAPI 托管类库。
总结
本“如何做”包括如下步骤:
1. 创建 ASP.NET 客户端 Web 应用程序
2. 测试应用程序
3. 修改 Web 应用程序,读取 Web.Config 文件中的加密连接字符串
1. 创建 ASP.NET 客户端 Web 应用程序
此过程创建一个 ASP.NET 客户端 Web 应用程序,该应用程序将调用 DPAPI 类库以加密或解密 Web.config 文件中存储的数据。
u 创建 ASP.NET 客户端 Web 应用程序
1. 启动 Visual Studio .NET,并创建一个名为 DPAPIClientWeb 的新 C# ASP.NET Web 应用程序。
2. 添加对(先前在“如何做:创建 DPAPI 库”中创建的)DataProtector.dll 程序集的引用。
3. 打开 WebForm1.aspx.cs,并将下面的 using 语句添加到文件顶部现有 using 语句的下面。
DataProtector dp = new DataProtector( DataProtector.Store.USE_MACHINE_STORE );
try
{
byte[] dataToEncrypt = Encoding.ASCII.GetBytes(txtDataToEncrypt.Text);
// Not passing optional entropy in this example
// Could pass random value (stored by the application) for added security
// when using DPAPI with the machine store.
txtEncryptedData.Text =
Convert.ToBase64String(dp.Encrypt(dataToEncrypt,null));
}
catch (Exception ex)
{
lblError.ForeColor = Color.Red;
lblError.Text = "Exception.<br>" + ex.Message;
return;
}
lblError.Text = "";
6. 返回到该 Web 表单,并双击“解密”按钮。将下面的代码添加到按钮单击事件处理程序中。
DataProtector dp = new DataProtector( DataProtector.Store.USE_MACHINE_STORE );
try
{
byte[] dataToDecrypt = Convert.FromBase64String(txtEncryptedData.Text);
// Optional entropy parameter is null.
// If entropy was used within the Encrypt method, the same entropy parameter
// must be supplied here
txtDecryptedData.Text =
Encoding.ASCII.GetString(dp.Decrypt(dataToDecrypt,null));
}
catch (Exception ex)
{
lblError.ForeColor = Color.Red;
lblError.Text = "Exception.<br>" + ex.Message;
return;
}
lblError.Text = "";
7. 在“构建”菜单中,单击“构建解决方案”
2. 测试应用程序
此过程测试 Web 应用程序以确认数据已成功加密和解密。
u 测试应用程序
1. 按 Ctrl+F5 键以运行 Web 应用程序。
2. 在“要加密的数据”文本框中输入一个字符串,然后单击“加密”。
确认加密的数据(采用 Base64 加密的格式)显示在“加密的数据”文本框中。
3. 单击“解密”按钮。
确认加密的数据已成功解密并显示在“解密的数据”文本框中。
3. 修改 Web 应用程序,读取 Web.Config 文件中的加密连接字符串
该过程采用一个加密的数据库连接字符串,并把加密的密码文本放在该应用程序的 Web.config 文件的 <appSettings> 元素内。然后您将添加代码,从该配置文件中读取和解密该字符串。
u 修改 Web 应用程序,读取 Web.Config 文件中的加密连接字符串
1. 返回到 Visual Studio .NET,以“设计器”模式显示 WebForm1.aspx。
2. 将另一个按钮添加到表单。将其“文本”属性设置为“从配置文件解密字符串”并将其 ID 属性设置为 btnDecryptConfig。
3. 双击该按钮,创建一个按钮单击事件处理程序。
4. 将下面的 using 语句添加到文件顶部现有 using 语句的下面。