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中获取密码