我想在我的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>
我一直在寻找,但还没有办法做到这一点。这可能吗?
答案 0 :(得分:5)
不开箱即用 - .NET为您提供加密部分的能力 - 但不是单个元素。但是,由于这些只是字符串,因此您可以自己创建一些方案来加密字符串,然后将其保存到文件中,并在从配置文件中读取后对其进行解密。
但这不是透明的 - 你必须自己做,你必须明确地做。
答案 1 :(得分:0)
当我需要从应用设置部分加密单个值时,我遇到了同样的问题。我使用EncryptText
类的DecryptText
和DpapiProtectedConfigurationProvider
私有方法,它允许我加密任何文本值,而不一定是配置元素。
这是辅助类:
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"));
}
此外,如果您可以访问XmlNode
或XmlElement
个实例,则可以使用提供程序类的公共方法:DpapiProtectedConfigurationProvider.Encrypt(XmlNode)
和DpapiProtectedConfigurationProvider.Decrypt(XmlNode)
而不是反射。