使用用户级DPAPI保护配置文件(WinForms)

时间:2014-01-24 15:33:04

标签: vb.net winforms app-config dpapi

我想保护app.config文件中的连接字符串。我正在使用此代码执行此操作:

Public Shared Sub ProtectConnString()
    Dim config As System.Configuration.Configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
    Dim configSection As System.Configuration.ConfigurationSection
    configSection = config.ConnectionStrings
    If Not (configSection Is Nothing) Then
        If Not (configSection.ElementInformation.IsLocked) Then
            configSection.SectionInformation.ProtectSection("DataProtectionConfigurationProvider")
            configSection.SectionInformation.ForceSave = True
            config.Save(ConfigurationSaveMode.Full)
        End If
    End If
End Sub

但是,我注意到它正在使用机器级DPAPI。我希望它使用用户级DPAPI。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

如果您想使用用户级DataProtectionConfigurationProvider而不是机器级别,请将下面的配置添加到app.config并添加代码,如下所示。

将此添加到app.config

<configProtectedData>
  <providers>
    <add useMachineProtection="false" keyEntropy="" name="MyUserDataProtectionConfigurationProvider" 
type="System.Configuration.DpapiProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0, Culture=neutral, 
PublicKeyToken=b03f5f7f11d50a3a" />
  </providers>
</configProtectedData>

C#代码

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

            SectionInformation appSettingsSecInfo = config.GetSection("appSettings").SectionInformation;
            if (!appSettingsSecInfo.IsProtected)
            {
               appSettingsSecInfo.ProtectSection("MyUserDataProtectionConfigurationProvider");

                appSettingsSecInfo.ForceSave = true;

                config.Save(ConfigurationSaveMode.Full);
                MessageBox.Show("Config was not encrypted but now is encrypted");
            }
            else
            {
                MessageBox.Show("Config is already encrypted");
            }

MessageBox.Show("Some very secure information is about to be shown: " + ConfigurationManager.AppSettings["SomeImportantInfo"].ToString());