gpt4 book ai didi

c# - 即时解密配置,包括 Entity Framework 的连接字符串

转载 作者:太空宇宙 更新时间:2023-11-03 13:18:38 25 4
gpt4 key购买 nike

谷歌搜索一段时间后,我找不到任何合适的解决方案来解决我的问题:我加密了我的 app.config,所以我在我的 appSettings 部分中得到了如下条目。

<add key="Modules" value="xx+LCaY//dRSq3H5z0TClbQbIUd1fm4krjTelMWu9bwkBB2SybkwMqAchYiLP7ss1EEotHtrZwrVtuc+1la5aVwUebCMMbPUj3reE+1XY1Q=" />

此外,我的连接字符串格式为

<add name="WorkflowEntries" connectionString="NEuhdfCDdGOeGjkk5PvMDl/Zr+75rOSDqifQZE3X6WJ6ZKjqG6J75O8d0b0j1AeXLVMGtkN7oPldtAWqppFKwCliJ+baMA2NVbkpLlMbhc/IH771MWjlC588USC8RzB7lz+BuXas4RS8kkDXmjENDAlEecLYA2nnkMFlXHJxCCOGA35JXTXWHZeQlFU0dBHVJlSUbqTEGTPETqe2tq/WQMfVpRHsLWlrReBplvGYqVZ+T8XTgaJellN0ZJY4f/UV9R2gjOOwvkBUxRJ2djymlbs4nek/oLuTKyCstd5sRluux8V2odplc98ehmVO0KJ0fBFHIzm4qjByj5pke+kc9FsYSTcqQ4KbBbuXwFI1Oc/1wORHOJbZlu40jioAXVDNiCZQh57cm40G9CRJNAE2Ww=="
providerName="System.Data.EntityClient" />

我可以围绕 ConfigurationManager.AppSettings 和 ConfigurationManager.ConnectionStrings 构建一个包装器,但 EF 不会使用它。有没有一种方法可以“虚拟操作”配置,以便应用程序的所有部分都可以访问这个配置?

提示:我知道 protected 配置的强大功能。由于我需要轻松部署我的应用程序,因此这不是我的选择。

最佳答案

我想我已经完成了。欢迎您发布我认为必须存在的更有说服力的解决方案。我创建了一个 CustomConfigurationManager,我将所有需要的逻辑放入其中。那么你可以这样走:

  1. 该类是静态的,所以只需调用 CheckConfig() 方法即可您的应用程序启动将检查 key “加密”应用程序设置。如果它已经存在什么都不会发生,否则全部appSettings 中的值和connectionStrings 部分被加密。 key “加密”将添加到配置中,以防止应用程序在下次启动时再次加密配置。

  2. 在复制粘贴操作中,我替换了所有出现的ConfigurationManager.AppSettings 通过CustomConfigurationManager.AppSettings。从配置(如 CustomConfigurationManager.AppSettings["SampleKey"])读取时,读取值将被即时解密。

  3. 最关键的部分是将 CustomConfigurationManager 和 Entity Framework 结合在一起。我通过手动替换上下文类中的构造函数来做到这一点。在此过程中,我使用了 CustomConfigurationManager.ConnectionStrings 索引器。

让我们仔细看看最后一步:所以有了配置片段

<add name="WorkflowEntries" connectionString="NEuhdfCDdGOeGjkk5PvMDl/Zr+75rOSDqifQZE3X6WJ6ZKjqG6J75O8d0b0j1AeXLVMGtkN7oPldtAWqppFKwCliJ+baMA2NVbkpLlMbhc/IH771MWjlC588USC8RzB7lz+BuXas4RS8kkDXmjENDAlEecLYA2nnkMFlXHJxCCOGA35JXTXWHZeQlFU0dBHVJlSUbqTEGTPETqe2tq/WQMfVpRHsLWlrReBplvGYqVZ+T8XTgaJellN0ZJY4f/UV9R2gjOOwvkBUxRJ2djymlbs4nek/oLuTKyCstd5sRluux8V2odplc98ehmVO0KJ0fBFHIzm4qjByj5pke+kc9FsYSTcqQ4KbBbuXwFI1Oc/1wORHOJbZlu40jioAXVDNiCZQh57cm40G9CRJNAE2Ww=="
providerName="System.Data.EntityClient" />

构造函数

public partial class WorkflowEntries : ObjectContext
{
#region Constructors

public WorkflowEntries()
: base("WorkflowEntries", "WorkflowEntries")
{
this.ContextOptions.LazyLoadingEnabled = true;
OnContextCreated();
}

...

成为

 public WorkflowEntries()
: base(CustomConfigurationManager.ConnectionStrings["WorkflowEntries"], "WorkflowEntries")
{
this.ContextOptions.LazyLoadingEnabled = true;
OnContextCreated();
}

如果您不想操作上下文类,您还可以在实例化上下文时使用采用连接字符串的重载。

这是我的 CustomConfigurationManager 类。请注意,我删除了加密和解密部分,因为我认为这些与此问题的上下文无关。

public static class CustomConfigurationManager
{

private static string pwd = "ThisIsNotBestPracticeForStoringPasswords".Select(x => x.ToString() + (x + 2).ToString()).Aggregate((current, next) => current + next);

public static AppSettingsIndexer AppSettings = new AppSettingsIndexer(pwd);
public static ConnectionStringsIndexer ConnectionStrings = new ConnectionStringsIndexer(pwd);

public static void CheckConfig()
{

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var appSettings = config.AppSettings;
var connectionStrings = config.ConnectionStrings.ConnectionStrings;

if (!appSettings.Settings.AllKeys.Contains("Encrypted"))
{
EncryptConfig(pwd, config, appSettings, connectionStrings);
}
}

private static void EncryptConfig(string pwd, Configuration config, AppSettingsSection appSettings, ConnectionStringSettingsCollection connectionStrings)
{
foreach (var key in appSettings.Settings.AllKeys)
{
appSettings.Settings[key].Value = StringCipher.Encrypt(appSettings.Settings[key].Value, pwd);
}

for (int i = 0; i < connectionStrings.Count; i++)
{
connectionStrings[i] = new ConnectionStringSettings(connectionStrings[i].Name, StringCipher.Encrypt(connectionStrings[i].ConnectionString, pwd), connectionStrings[i].ProviderName);
}

appSettings.Settings.Add("Encrypted", "True");
config.Save(ConfigurationSaveMode.Modified, true);
}


static class StringCipher
{
internal static string Encrypt(string plainText, string passPhrase)
{
if (plainText.Trim() == "")
return "";

/* Add your encryption stuff here */
}

internal static string Decrypt(string cipherText, string passPhrase)
{
if (cipherText.Trim() == "")
return "";

/* Add decryption stuff here */
}
}

public class AppSettingsIndexer
{
static string pwd;

public AppSettingsIndexer(string _pwd)
{
pwd = _pwd;
}

public string this[string index]
{
get
{
return StringCipher.Decrypt(ConfigurationManager.AppSettings[index], pwd);
}
}
}

public class ConnectionStringsIndexer
{
static string pwd;

public ConnectionStringsIndexer(string _pwd)
{
pwd = _pwd;
}

public string this[string index]
{
get
{
var connectionString = ConfigurationManager.ConnectionStrings[index];
return new ConnectionStringSettings(connectionString.Name, StringCipher.Decrypt(connectionString.ConnectionString, pwd), connectionString.ProviderName).ToString();
}
}
}

}

关于c# - 即时解密配置,包括 Entity Framework 的连接字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25164875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com