简单的解决方法:
WebConfig 加解密,未能使用提供程序“RsaProtectedConfigurationProvider”进行解密。提供程序返回错误消息为: 打不开 RSA 密钥容器。
问题:未添加用于访问 RSA 密钥容器
命令:aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT AUTHORITY/NETWORK SERVICE"
注意事项:XP下:aspnet_regiis -pa "NetFrameworkConfigurationKey" "aspnet"
加密:aspnet_regiis -pe "appSettings" -app "/应用程序名"
解密:aspnet_regiis -pd "appSettings" -app "/应用程序名" 如(/PetShop/web)
更灵活的解决方法:
1、创建一个密钥容器
aspnet_regiis -pc "ConnectionStringsKey" -exp
ConnectionStringsKey为密钥容器的名称
可以使用aspnet_regiis /?查看该命令的用法
2、在web.config中加入如下内容
[c-sharp]
<configProtectedData>
<providers>
<clear />
<add name="ConnectionStringsKeyProvider"
type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0,Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
keyContainerName="ConnectionStringsKey"
useMachineContainer="true"/>
</providers>
</configProtectedData>
3、通过命令行:用指定的密钥加密指定目录下的web.config文件的指定的配置节
aspnet_regiis -pef "connectionStrings" "d:/testproj/websitetest" -prov "ConnectionStringsKeyProvider"
对于子配置节用/分隔表示, 如identity配置节 需要写成 "system.web/identity"
4、如果访问web程序,页面提示 Error message from the provider: The RSA key Container could not be opened.
是由于network service帐户无法访问密钥文件造成的。 找到密钥文件, 赋予network service读权限。该密钥文件位于(可按时间排序,找到自己产生的那个密钥文件)
vista: c:/ProgramData/Microsoft/Crypto/RSA/MachineKeys/
xp或其他:C:/Documents and Settings/All Users/Application Data/Microsoft/Crypto/RSA/MachineKeys
至此:查看被加密的标记, 内容就已经是被加密过的了。
5.通过.aspx页面:加密连接字符串:界面如图:
后台代码:
[c-sharp]
//加密按钮
protected void Button1_Click(object sender, EventArgs e)
{
//①需要加密的节点:
string name = @"connectionStrings";
//②当前路径;
string appPath = "/loginContral";
Configuration config = WebConfigurationManager.OpenWebConfiguration(appPath);
//③提供加密的方式:(这里使用自定义的加密方式)
// string provider = "RsaProtectConfigurationProvider";
string provider = "ConnectionStringsKeyProvider";
config.GetSection(name).SectionInformation.ProtectSection(provider);
//⑤保存web.config文件
try
{
config.Save();
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
if (config.GetSection(name).SectionInformation.IsProtected)
{
Button1.Enabled = false;
Response.Write("加密成功!");
}
else
{
Response.Write("加密失败!");
}
}
//解密按钮:
protected void Button2_Click(object sender, EventArgs e)
{
//①需要节密的节点:
string name = @"connectionStrings";
//②当前路径;
string appPath = "/loginContral";
Configuration config = WebConfigurationManager.OpenWebConfiguration(appPath);
//③使用UnprotectSection方法进行解密;
config.GetSection(name).SectionInformation.UnprotectSection();
//④保存web.config文件
config.Save();
if (config.GetSection(name).SectionInformation.IsProtected==false)
{
Button2.Enabled = false;
Response.Write("解密成功!");
}
else
{
Response.Write("解密失败!");
}
}
注意:string appPath = "/loginContral" 为当前项目路径;
加密前的连接字符串:
[c-sharp]
<connectionStrings>
<add name="connection" connectionString="data source=.;database=aspnetdb;user id=sa;pwd=123;" />
</connectionStrings>
加密后的连接字符串:
[c-sharp]
<connectionStrings configProtectionProvider="ConnectionStringsKeyProvider">
<EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">