C# 如何使用实体框架在winforms应用程序上实现连接字符串的加密和解密解决方案?

C# 如何使用实体框架在winforms应用程序上实现连接字符串的加密和解密解决方案?,c#,winforms,entity-framework,encryption,C#,Winforms,Entity Framework,Encryption,我想知道如何在我的桌面应用程序上实现此解决方案,以防止用户检查配置文件并增加一些本地安全性。 我用这两种方法创建了一个安全类,这不是一种复杂的机制,而是一种非常基本的机制: string Encrypt(string source, string key) { using (TripleDESCryptoServiceProvider tripleDESCryptoService = new TripleDESCryptoServiceProvider())

我想知道如何在我的桌面应用程序上实现此解决方案,以防止用户检查配置文件并增加一些本地安全性。
我用这两种方法创建了一个安全类,这不是一种复杂的机制,而是一种非常基本的机制:

    string Encrypt(string source, string key)
    {
        using (TripleDESCryptoServiceProvider tripleDESCryptoService = new TripleDESCryptoServiceProvider())
        {
            using (MD5CryptoServiceProvider hashMD5Provider = new MD5CryptoServiceProvider())
            {
                byte[] byteHash = hashMD5Provider.ComputeHash(Encoding.UTF8.GetBytes(key));
                tripleDESCryptoService.Key = byteHash;
                tripleDESCryptoService.Mode = CipherMode.ECB;
                byte[] data = Encoding.UTF8.GetBytes(source);
                return Convert.ToBase64String(tripleDESCryptoService.CreateEncryptor().TransformFinalBlock(data, 0, data.Length));
            }
        }
    }

    string Decrypt(string encrypt, string key)
    {
        using (TripleDESCryptoServiceProvider tripleDESCryptoService = new TripleDESCryptoServiceProvider())
        {
            using (MD5CryptoServiceProvider hashMD5Provider = new MD5CryptoServiceProvider())
            {
                byte[] byteHash = hashMD5Provider.ComputeHash(Encoding.UTF8.GetBytes(key));
                tripleDESCryptoService.Key = byteHash;
                tripleDESCryptoService.Mode = CipherMode.ECB;
                byte[] data = Convert.FromBase64String(encrypt);
                return Encoding.UTF8.GetString(tripleDESCryptoService.CreateDecryptor().TransformFinalBlock(data, 0, data.Length));
            }
        }
    }
并创建了AppSettings类以获取和保存连接字符串:

public class AppSettings
{
    Configuration config;

    public AppSettings()
    {
        config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    }

    public string GetConnectionString(string key)
    {
        return config.ConnectionStrings.ConnectionStrings[key].ConnectionString;
    }

    public void SaveConnectionString(string key, string value)
    {
        config.ConnectionStrings.ConnectionStrings[key].ConnectionString = value;
        config.ConnectionStrings.ConnectionStrings[key].ProviderName = "System.Data.EntityClient";
        config.Save(ConfigurationSaveMode.Modified);
    }

}
现在,我想实现这个方法,保存加密的连接字符串,并使用实体框架读取解密的字符串,但不确定如何执行此操作

public AnnualTaxDBEntities(): base("name=AnnualTaxDBEntities")
{

}

我是c#的新手,所以欢迎理解

添加传递连接字符串的新构造函数:

public AnnualTaxDBEntities(String connectionString): base(connectionString)
{

}
然后,只需将连接字符串传递到构造函数:

var connectionString = appSettings.GetConnectionString(key);
var dataContext = AnnualTaxDBEntities(connectionString);

尽管请注意,这不会阻止任何半胜任人员查看您的连接字符串,但它在源代码中仍然可见-如果您的连接字符串包含凭据等敏感数据,则应使用适当的外部秘密初始化方法。或者更好的方法是,首先使用集成安全性,不要将敏感数据存储在连接字符串中。

一种方法是使用外部配置文件和受保护的配置提供程序,请参阅


这将允许您在应用程序部署的app.config文件之外指定连接字符串,并加密该文件的内容

1-如果可以避免,请不要尝试加密敏感数据。如果是winforms和公司应用程序(域内),则应避免使用数据库用户,并使用windows用户身份验证。2-当真的需要密码时,你应该使用更好的密码算法,不要使用三重DES。这只适用于ASP这样的托管环境,对吗?不适用于运行winforms程序的用户?@Milney不适用,正如我链接到详细信息的文档所示,这里有一个app.config和一个web.config示例。我在旧版WinForms AppsAh cool中使用过它,但我不知道你可以将它们与桌面应用程序一起使用。我的其他观点仍然站在那里,尽管这仍然是不安全的,因为信息将被解密以供使用,所以用户仍然可以从RAM中获取密码