使用RsaProtectedConfigurationProvider加密/解密app.config部分

时间:2010-11-23 13:40:33

标签: c# configuration encryption rsa

在我们的程序安装过程中,我们运行此方法来加密app.config的各个部分:

// Get the application configuration file.
Configuration config =
      ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

// Define the Rsa provider name.
const string provider = "RsaProtectedConfigurationProvider";

// Get the section to protect.
ConfigurationSection connStrings = config.ConnectionStrings;

if (connStrings != null)
{
    if (!connStrings.SectionInformation.IsProtected)
    {
        if (!connStrings.ElementInformation.IsLocked)
        {
            // Protect the section.
            connStrings.SectionInformation.ProtectSection(provider);

            connStrings.SectionInformation.ForceSave = true;
            config.Save(ConfigurationSaveMode.Full);
        }
    }
}

到目前为止工作正常。但是如果我运行这个程序,我们遇到几台机器出现以下错误“无法使用提供程序'RsaProtectedConfigurationProvider解密'。来自提供程序的错误消息:无法打开RSA密钥容器”。

当然我搜索并找到this help,但这不起作用。有什么想法吗?

3 个答案:

答案 0 :(得分:5)

我在Win 7上的Visual Studio 2010中进行调试时遇到了类似的问题,UAC设置为默认保护。

为了解决这个问题,我必须以管理员身份运行Visual Studio(“以管理员身份运行”)。

我在尝试运行aspnet_regiis.exe来加密我的web.config部分时遇到了同样的问题。如果我没有“以管理员身份”运行命令行/控制台,我会得到一个更加神秘的命令行错误:“对象已经存在。”

答案 1 :(得分:3)

原因是那些工作的机器在 machine.config 中设置了RsaProtectedConfigurationProvider。那些不工作的,没有它 - 只需手动为这些机器添加

我想这是 aspnet_regiis.exe 的其中一个步骤。我无法想象您想在所有客户端计算机上运行它。

<强>更新

好的,我已经在你的问题中以粗体显示了错误的主要部分 - 你说得对,这是一个不同的问题。这是安全问题。如果您查看位置 C:\ Documents and Settings \ All Users \ Application Data \ Microsoft \ Crypto \ RSA \ MachineKeys C:\ ProgramData \ Microsoft \ Crypto \ RSA \ MachineKeys < / strong>根据操作系统,您会看到许多文件。您的进程可以访问该文件夹,因此只需提供文件访问整个文件夹的应用程序标识或特定文件(时间戳将告诉您是否已创建它)。

答案 2 :(得分:0)

我在设置为SQL Server的Windows Server上运行的app.config上得到了这个。它没有安装IIS。 machine.config文件列出了RSAProtectedConfigurationProvider作为默认值,但是当我们查看Aliostad上面提到的两个文件夹时,文件夹是空的。没有安装任何密钥。我们使用aspnet_regiis工具来创建自定义键。然后我们使用它来授予对批处理作业运行的标识的访问权限。所有这些都是以管理员身份运行cmd.exe和aspnet_regiis。