ASP.NET IIS 注册工具 (Aspnet_regiis.exe)官方文档:http://msdn.microsoft.com/zh-cn/library/k6h9cz8h(VS.80).aspx
配置文件webform下是web.config,winform下是app.config,如果要加密app.config,先把它改名为:web.config,加密后再重新改回原名就可以了
打开SDK命令提示执行以下命令:(开始-->所有程序-->Microsoft .NET Framework SDK v2.0-->SDK命令提示 )
加密:aspnet_regiis -pef "配置节" "目录"
解密:aspnet_regiis -pdf "配置节" "目录"
如:aspnet_regiis -pef "appSettings" "C:/Inetpub/wwwroot/hr512"
加密C:/Inetpub/wwwroot/hr512/web.config中设置的appSettings节点中的内容
读取节点值和未加密前相同,.net会自动解密
如果出现以下错误信息:
未能使用提供程序“RsaProtectedConfigurationProvider”进行解密。提供程序返回错误消息为: 打不开 RSA 密钥容器。
解决方法:
在SDK命令下运行:aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT AUTHORITY/NETWORK SERVICE"
================================================================================
如果想对web.config的数据库连接字符串进行加密的话,这里提供了两个方法:
方法一
使用“DataProtectionConfigurationProvider”形式加密。
创建test.aspx文件,代码如下:
需要添加引用 using System.Web.Configuration; using System.IO; //加密 protected void Button1_Click(object sender, EventArgs e) { Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath); ConfigurationSection section = config.GetSection("connectionStrings"); if (section != null && !section.SectionInformation.IsProtected) { section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider"); config.Save(); } } //解密 protected void Button2_Click(object sender, EventArgs e) { Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath); ConfigurationSection section = config.GetSection("connectionStrings"); if (section != null && section.SectionInformation.IsProtected) { section.SectionInformation.UnprotectSection(); config.Save(); } }
总结:此方法很方便,并且很简单,但安全性没有密钥加密高。
方法二
使用“RSAProtectedConfigurationProvider”形式来加密
test.aspx程序文件基本如上,
把section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
改成section.SectionInformation.ProtectSection("RSAProtectedConfigurationProvider");
但这个时候你访问网站的时候很有可能会出现
说明: 在处理向该请求提供服务所需的配置文件时出错。请检查下面的特定错误详细信息并适当地修改配置文件。
分析器错误信息: 未能使用提供程序“RsaProtectedConfigurationProvider”进行解密。提供程序返回错误信息为: 打不开 RSA 密钥容器。
这样的错误,解决方法是:
进dos运行:aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT AUTHORITY/NETWORK SERVICE"
如果运行出错,需要把目录 C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727 放入环境变量path中。
此时就可以成功访问网站了。
同样可以通过命令行来实现“RSAProtectedConfigurationProvider”加密。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
您可能会出现的问题:
一:分析器错误信息: 未能使用提供程序“DataProtectionConfigurationProvider”进行解密。提供程序返回错误信息为: 该项不适于在指定状态下使用。
二:未能使用提供程序“RsaProtectedConfigurationProvider”进行解密。提供程序返回错误消息为: 打不开 RSA 密钥容器。
解决办法:(请耐心看完,你一定会找到问题所在的。)
如何使用 Enterprise Library 3.0 的Cryptography Application Block 处理加密 本文不演示如何使用配置工具对配置区进行加密,也不演示如何导出导入 key 文件,而主要解决两个问题: 1.我们使用配置工具对配置区进行加密后,(通常 configProtectionProvider 有两种选择,一个是RsaProtectedConfigurationProvider,一个是 DataProtectionConfigurationProvider),在本机使用正常,但是如果换到其它机器上,再用配置工具,就无法打开。使用 RsaProtectedConfigurationProvider的,报的错误如下:未能使用提供程序 "RsaProtectedConfigurationProvider" 进行解秘密。 2.我们使用Cryptography Application Block 的加密处理块后,创建了一个 Symmetric Providers,并使用了 DESCryptoServiceProvider 提供的算法,这个过程中产生了一个 key 文件。但是这个 key 文件复制的其他机器是无效的(后面解释原因)。当然,我们可以通过现在本机导出的key 的方式,然后在其他机器上导入 key 文件。但是这样只解决了开发人员之间要使用相同的 key文件的问题。对于部署到客户端,则不行。因为我们不大可能去客户端上安装 Enterprise Library 3.0 ,更不可能在安装程序后,再来手工配置这个 key。(因为这样明显增加了安装程序的复杂性,而安装程序的人很可能就不是专业人员。) 首先声明一点,打算在 protectedKeyFilename 中使用相对路径的想法不是太行的通!为什么这么说呢?因为 key 文件无法直接复制到其他机器上。当我们去每台机器上配置 key 文件(包括创建新的key或者导入key,均需要保存 key 的绝对路径的位置),我们已经知道了绝对路径,所以没有必要去用相对路径! David Hayden 在回答一位网友关于为什么不使用相对路径中说到:I would have thought that relative paths would be fine, but I pulled this from the documentation within the section Managing and Distributing Keys which is pretty specific about the need for absolute paths .... The Cryptography Application Block stores each key in a separate file on the local computer.... 他的意思说:虽然我本来认为相对路径将会是巧妙的,(实际上却不是这样),但是我将它从文档中“管理和分发 key 文件”的部分移开了,并在这个部分中相当明确地说明需要使用绝对路径 ... 加密应用程序块为每个 key 文件在本地计算机中存储了一个独立的文件。(原文见http://www.codeplex.com/entlib/Thread/View.aspx?ThreadId=9834) 上面一大段废话浓缩成成一句:既然是 key 文件都与本地计算机相关了,那相对路径自然意义就不大了(不敢说绝对没有意义). key 文件无法直接复制到其他机器上的原因是对这个密钥文件又使用 DPAPI (Windows 数据保护) 进行加密。使用了 DPAPI 进行加密的数据只能在特定的计算机上使用,换个机器当然就不行了!因为你加密的时候使用了当前计算机和登陆到该计算机的用户的信息。 所以顺便提一点:产生 key 文件的过程中有个选择项, 一个是用户模式,一个是机器模式。用户模式是登陆到该计算机的用 户才能使用这个 key文件,机器模式当然就是只要是这个计算机上的用户都可以使用这个 key 文件。比如部署 WebForms 的 WebSite 需要使用机器模式,至于WinForms的部署,如果不能确认计算机上只有一个帐户会使用你部署的软件,还是使用机器模式吧 ! 针对第一个问题的解决方案: 如果想将一个配置文件(比如web.config, App.config)在一台计算机加密后,在其他计算机上都能使用,就达到了我们的目的。 说到对配置文件加密,自然要提到它们两个: DPAPIProtectedConfigurationProvider。使用 Windows 数据保护 API (DPAPI)对数据进行加密和解密。 RsaProtectedConfigurationProvider。使用 RSA 加密算法对数据进行加密和解密。 这两个提供程序都提供对数据的强加密;但是,如果打算在多台计算机上使用同一个加密配置文件,则只有使用 RsaProtectedConfigurationProvider。因为这个才能导出用于对数据进行加密的加密密钥,并在另一台计算机上导入它们。 我们使用配置工具对配置文件的配置区进行加密时可以指定哪个ProtectedConfigurationProvider。很显然,在解决这个问题上,我们只能使用 RsaProtectedConfigurationProvider。由于不同的计算机上RSA密钥容器是各不相同的,所以我们需要从一台计算机上导出一个RSA 密钥容器,然后导入其他计算机上!由于导入方式是可以用 DOS 命令实现,所以在部署上不存在问题!另外,由于.NET Framework 有个默认的RSA密钥容器,名称为 "NetFrameworkConfigurationKey" ,在machine.config文件可以看到这个默认的参数。 先提示以下:aspnet_regiis.exe 在 C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727 下。C 盘是我的安装路径。所以使用 DOS 命令要注意路径。(可以通过 开始菜单 -> 所有程序 -> Microsoft Visual Studio 2005 -> Visual Studio Tools -> Visual Studio 2005 命令提示 来打开使用 aspnet_regiis 命令的 cmd 界面。) 步骤如下: (1)在当前计算机上,导出 RSA密钥容器。(可以在导出文件前指定路径。) aspnet_regiis -px "NetFrameworkConfigurationKey" D:/RSAkeys.xml -pri (2)在当前计算机上,用企业库工具加密配置文件。ProtectedConfigurationProvider 只能选择 RsaProtectedConfigurationProvider。 (3)在部署的计算机上, 导入名为 "NetFrameworkConfigurationKey" 的 RSA 密钥容器。 aspnet_regiis -pi "NetFrameworkConfigurationKey" D:/RSAkeys.xml (1)和(2)可以在当前计算机直接操作,(3)的 DOS 命令可以在部署时由程序中完成。 这样就完成了! 提示一下:有可能步骤(1)导出失败,它不能使用 -pri 这个参数,而这个参数是导出解密使用的信息!如果没有它,在其他机器上只能加密新的东西。那么解决方法如下: (1)在当前计算机上, 创建新的 RSA 密钥容器,它的名称为: CustomKeys 。(这里有个用户级别和计算机级别的,下面的方式是创建计算机级别的,名字按照你的要求取) aspnet_regiis -pc "CustomKeys" -exp (2) 在当前计算机上, 向帐户授予访问权限 aspnet_regiis -pa "CustomKeys" "NT AUTHORITY/NETWORK SERVICE" 其他需要访问权限的帐户也应该被授权。 (3)在当前计算机上,导出 RSA密钥容器。(可以在导出文件前指定路径。) aspnet_regiis -px "CustomKeys" D:/RSAkeys.xml -pri (4)在当前计算机上,将machine.config (在C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/CONFIG) 中 keyContainerName = "NetFrameworkConfigurationKey" 替换为我们新创建的名称:keyContainerName = "CustomKeys"。 (5)在当前计算机上,用企业库工具加密配置文件。ProtectedConfigurationProvider只能选择 RsaProtectedConfigurationProvider。 (6)在部署的计算机上, 导入名为 "NetFrameworkConfigurationKey" 的 RSA 密钥容器。 aspnet_regiis -pi "NetFrameworkConfigurationKey" D:/RSAkeys.xml 顺便提一下删除 RSA密钥容器 的命令: aspnet_regiis -pz "CustomKeys" 当你输入一个错误的命令,会显示帮助命令信息。另外提示: 以上命令如果使用复制的方式,一定要注意检查下划线和空格的位置! 针对第二个问题,提出两种解决方案: 方案一: 前面提到过,可以使用先导出key文件,然后再导入 key 文件的方法解决,仅解决开发人员之间的需要,却不符合我们部署的实际需要!当然,如果你愿意在部署的机器上安装 Enterprise Library 3.0,然后用它来重新配置加密文件,是非常简便的。下面提出符合实际部署需求的解决方法。 既然可以Enterprise Library 3.0通过手工的方式可以在部署的机器上导入 key 文件。这也意味我们可以通过编程的方式来部署的机器上导入 key 文件。因为手工导入也要通过程序来实现的。 那么,这部分代码去哪里找呢?Enterprise Library 3.0不是提供了源代码的嘛,而且包括配置工具的源代码。在 C:/EntLib3Src/App Blocks 目录(我的安装目录)下 EnterpriseLibrary 解决方案件文件,就是这个东西,我们可以从里面寻找一些蛛丝马迹。 这里举例只针对 symmetricCryptoProviders 部署 key 文件! 一、部署的新的key 文件步骤如下: (1)创建一个新的 key 文件。 //-- 产生新的 key 文件 byte[] key = KeyManager.GenerateSymmetricKey(typeof(DESCryptoServiceProvider)); byte[] encryptedKey = ProtectedData.Protect(key, null, DataProtectionScope.CurrentUser); Stream fs = null; try { fs = new FileStream(keyFilePath, FileMode.Create); KeyManager.Write(fs, encryptedKey, DataProtectionScope.CurrentUser); fs.Flush(); } finally { if (fs != null) fs.Close(); } (2)修改配置文件中 key 文件的路径。就是那个 protectedKeyFilename 属性。 /**
上面这段文字的重心:
既然是 key 文件都与本地计算机相关了,那相对路径自然意义就不大了(不敢说绝对没有意义). key 文件无法直接复制到其他机器上的原因是对这个密钥文件又使用 DPAPI (Windows 数据保护) 进行加密。使用了 DPAPI 进行加密的数据只能在特定的计算机上使用,换个机器当然就不行了!因为你加密的时候使用了当前计算机和登陆到该计算机的用户的信息。
所以顺便提一点:产生 key 文件的过程中有个选择项, 一个是用户模式,一个是机器模式。用户模式是登陆到该计算机的用户才能使用这个 key文件,机器模式当然就是只要是这个计算机上的用户都可以使用这个 key 文件。比如部署 WebForms 的WebSite 需要使用机器模式,至于WinForms的部署,如果不能确认计算机上只有一个帐户会使用你部署的软件,还是使用机器模式吧!
针对第一个问题的解决方案:
如果想将一个配置文件(比如web.config, App.config)在一台计算机加密后,在其他计算机上都能使用,就达到了我们的目的。
说到对配置文件加密,自然要提到它们两个:
DPAPIProtectedConfigurationProvider。使用 Windows 数据保护 API (DPAPI)对数据进行加密和解密。
RsaProtectedConfigurationProvider。使用 RSA 加密算法对数据进行加密和解密。
这两个提供程序都提供对数据的强加密;但是,如果打算在多台计算机上使用同一个加密配置文件,则只有使用RsaProtectedConfigurationProvider。因为这个才能导出用于对数据进行加密的加密密钥,并在另一台计算机上导入它们。
我们使用配置工具对配置文件的配置区进行加密时可以指定哪个ProtectedConfigurationProvider。很显然,在解决这个问题上,我们只能使用 RsaProtectedConfigurationProvider。由于不同的计算机上RSA密钥容器是各不相同的,所以我们需要从一台计算机上导出一个RSA 密钥容器,然后导入其他计算机上!由于导入方式是可以用 DOS 命令实现,所以在部署上不存在问题!另外,由于.NET Framework 有个默认的RSA密钥容器,名称为 "NetFrameworkConfigurationKey" ,在machine.config文件可以看到这个默认的参数。
先提示以下:aspnet_regiis.exe 在 C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727 下。C 盘是我的安装路径。所以使用 DOS 命令要注意路径。(可以通过 开始菜单 -> 所有程序 -> Microsoft Visual Studio 2005 -> Visual Studio Tools -> Visual Studio 2005 命令提示 来打开使用 aspnet_regiis 命令的 cmd 界面。)
(如果您找不到Visual Studio 2005 命令提示,则说明您没有安装完全)
步骤如下:
(1):在当前计算机上,导出 RSA密钥容器。(可以在导出文件前指定路径。)
aspnet_regiis -px "NetFrameworkConfigurationKey" D:/RSAkeys.xml -pri
(2):在当前计算机上,用企业库工具加密配置文件。ProtectedConfigurationProvider 只能选择
RsaProtectedConfigurationProvider。
(3):在部署的计算机上, 导入名为 "NetFrameworkConfigurationKey" 的 RSA 密钥容器。
aspnet_regiis -pi "NetFrameworkConfigurationKey" D:/RSAkeys.xml
(1)和(2)可以在当前计算机直接操作,(3)的 DOS 命令可以在部署时由程序中完成。
这样就完成了!
提示一下:有可能步骤(1)导出失败,它不能使用 -pri 这个参数,而这个参数是导出解密使用的信息!如果没有它,在其他机器上只能加密新的东西。那么解决方法如下:
(1)在当前计算机上, 创建新的 RSA 密钥容器,它的名称为: CustomKeys 。(这里有个用户级别和计算机级别的,下面的方式是创建计算机级别的,名字按照你的要求取)
aspnet_regiis -pc "CustomKeys" -exp
(2) 在当前计算机上, 向帐户授予访问权限
aspnet_regiis -pa "CustomKeys" "NT AUTHORITY/NETWORK SERVICE"
其他需要访问权限的帐户也应该被授权。
(3)在当前计算机上,导出 RSA密钥容器。(可以在导出文件前指定路径。)
aspnet_regiis -px "CustomKeys" D:/RSAkeys.xml -pri
(4)在当前计算机上,将machine.config (在C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/CONFIG) 中 keyContainerName = "NetFrameworkConfigurationKey" 替换为我们新创建的名称:keyContainerName = "CustomKeys"。
(5)在当前计算机上,用企业库工具加密配置文件。ProtectedConfigurationProvider只能选择 RsaProtectedConfigurationProvider。
(6)在部署的计算机上, 导入名为 "NetFrameworkConfigurationKey" 的 RSA 密钥容器。
aspnet_regiis -pi "NetFrameworkConfigurationKey" D:/RSAkeys.xml
顺便提一下删除 RSA密钥容器 的命令:
aspnet_regiis -pz "CustomKeys"
当你输入一个错误的命令,会显示帮助命令信息。另外提示: 以上命令如果使用复制的方式,一定要注意检查下划线和空格的位置!