是否可以保护appSettings部分中的单个元素而不是整个部分?

时间:2010-04-28 19:19:36

标签: c# .net app-config

我想在我的appSettings中保护一个键/值对,而不是使用像我以前使用ProtectSection方法那样的其他东西来保护,如下所示。

var configurationSection = config.GetSection("appSettings");
configurationSection.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");

理想情况下,我想做以下事情:

var configurationElement = config.GetSection("appSettings").GetElement("Protected");
configurationElement.ElementInformation.ProtectElement("DataProtectionConfigurationProvider");

以下是我将要操作的示例appSettings:

<configuration>
<appSettings>
    <add key="Unprotected" value="ChangeMeFreely" />
    <add key="Protected" value="########"/>
</appSettings>
</configuration>

我一直在寻找,但还没有办法做到这一点。这可能吗?

2 个答案:

答案 0 :(得分:5)

不开箱即用 - .NET为您提供加密部分的能力 - 但不是单个元素。但是,由于这些只是字符串,因此您可以自己创建一些方案来加密字符串,然后将其保存到文件中,并在从配置文件中读取后对其进行解密。

但这不是透明的 - 你必须自己做,你必须明确地做。

答案 1 :(得分:0)

当我需要从应用设置部分加密单个值时,我遇到了同样的问题。我使用EncryptText类的DecryptTextDpapiProtectedConfigurationProvider私有方法,它允许我加密任何文本值,而不一定是配置元素。

这是辅助类:

public class WebConfigEncryption
{
    private readonly DpapiProtectedConfigurationProvider _provider;
    private readonly MethodInfo _encryptTextMethod;
    private readonly MethodInfo _decryptTextMethod;

    public WebConfigEncryption()
    {
        _provider = new DpapiProtectedConfigurationProvider();
        _encryptTextMethod = _provider.GetType().GetMethod("EncryptText", BindingFlags.Instance | BindingFlags.NonPublic);
        _decryptTextMethod = _provider.GetType().GetMethod("DecryptText", BindingFlags.Instance | BindingFlags.NonPublic);
    }

    public string Encrypt(string value)
    {
        var encryptedValue = value != null ? (string)_encryptTextMethod.Invoke(_provider, new object[] { value }) : null;

        return encryptedValue;
    }

    public string Decrypt(string value)
    {
        var decryptedValue = value != null ? (string)_decryptTextMethod.Invoke(_provider, new object[] { value }) : null;

        return decryptedValue;
    }
}

使用示例:

[Test]
public void EncryptDecryptTest()
{
    var instance = new WebConfigEncryption();

    var encrypted = instance.Encrypt("123");
    var decrypted = instance.Decrypt(encrypted);
    Assert.That(decrypted, Is.EqualTo("123"));
}

此外,如果您可以访问XmlNodeXmlElement个实例,则可以使用提供程序类的公共方法:DpapiProtectedConfigurationProvider.Encrypt(XmlNode)DpapiProtectedConfigurationProvider.Decrypt(XmlNode)而不是反射。