Miss_samira
شنبه 19 اسفند 1391, 12:40 عصر
سلام دوستان، من برای جلوگیری از دسترسی به اطلاعات user و pass دیتابیس موجود در فایل app.config قصد دارم در زمان نصب برنامه این فایل را encrypt کنم. در ظاهر امر بدون هیچ خطایی این اتفاق میفته اما زمانیکه بعد از نصب، در مسیر نصب app.config را بررسی میکنم کماکان اطلاعات رمز نشده است :-؟؟
قابل توجه اینکه من در همون مراحل نصب، اطلاعات دیتابیس مثل نام سرور و userو pass رو از کاربر دریافت میکنم، و بعد از دخیره سازی آن میخوام که encrypt شه.
کدی که در کلاس installer.cs دارم :
protected override void OnAfterInstall(IDictionary savedState)
{
base.OnAfterInstall(savedState);
string dataSource = Context.Parameters["DataSource"];
dataSource = dataSource.Replace('/', ';');
MessageBox.Show("instance=" + dataSource);
dataSource = dataSource.Replace("$", @"\");
dataSource = dataSource.Replace("UserID", @"User ID");
dataSource = dataSource.Replace(@"\\", @"\");
dataSource = "Data source = " + dataSource.Replace("InitialCatalog",
@"Initial Catalog");
string pwd = Context.Parameters["Password"];
ExeConfigurationFileMap map = new ExeConfigurationFileMap();
string configFile = string.Concat(Assembly.GetExecutingAssembly().Loca tion,
".config");
map.ExeConfigFilename = configFile;
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(ma p, System.Configuration.ConfigurationUserLevel.None);
ConnectionStringSettings connectionstring = new ConnectionStringSettings("insuranceConnectionString", dataSource);
config.ConnectionStrings.ConnectionStrings.Add(con nectionstring);
config.Save(ConfigurationSaveMode.Modified, true);
ConfigurationManager.RefreshSection("insuranceConnectionStrings");
Properties.Settings.Default.Reload();
cryptography.ProtectConnectionString();
}
کد موجود در کلاس cryptography.cs
public static void ProtectConnectionString()
{
ToggleConnectionStringProtection(Application.Execu tablePath, true);
}
public static void UnprotectConnectionString()
{
ToggleConnectionStringProtection(Application.Execu tablePath, false);
}
private static void ToggleConnectionStringProtection(string pathName, bool protect)
{
string strProvider = "DataProtectionConfigurationProvider";
Configuration oConfiguration = null;
ConnectionStringsSection oSection = null;
try
{
oConfiguration = ConfigurationManager.OpenExeConfiguration(pathName );
if (oConfiguration != null)
{
bool blnChanged = false;
oSection = oConfiguration.GetSection("connectionStrings") as ConnectionStringsSection;
if (oSection != null)
{
if ((!(oSection.ElementInformation.IsLocked)) &&
(!(oSection.SectionInformation.IsLocked)))
{
if (protect)
{
if (!(oSection.SectionInformation.IsProtected))
{
blnChanged = true;
oSection.SectionInformation.ProtectSection(strProv ider);
}
}
else
{
if (oSection.SectionInformation.IsProtected)
{
blnChanged = true;
oSection.SectionInformation.UnprotectSection();
}
}
}
if (blnChanged)
{
oSection.SectionInformation.ForceSave = true;
oConfiguration.Save();
}
}
}
}
catch (System.Exception ex)
{ throw (ex); }
}
ممنون از راهنمایی تون.
قابل توجه اینکه من در همون مراحل نصب، اطلاعات دیتابیس مثل نام سرور و userو pass رو از کاربر دریافت میکنم، و بعد از دخیره سازی آن میخوام که encrypt شه.
کدی که در کلاس installer.cs دارم :
protected override void OnAfterInstall(IDictionary savedState)
{
base.OnAfterInstall(savedState);
string dataSource = Context.Parameters["DataSource"];
dataSource = dataSource.Replace('/', ';');
MessageBox.Show("instance=" + dataSource);
dataSource = dataSource.Replace("$", @"\");
dataSource = dataSource.Replace("UserID", @"User ID");
dataSource = dataSource.Replace(@"\\", @"\");
dataSource = "Data source = " + dataSource.Replace("InitialCatalog",
@"Initial Catalog");
string pwd = Context.Parameters["Password"];
ExeConfigurationFileMap map = new ExeConfigurationFileMap();
string configFile = string.Concat(Assembly.GetExecutingAssembly().Loca tion,
".config");
map.ExeConfigFilename = configFile;
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(ma p, System.Configuration.ConfigurationUserLevel.None);
ConnectionStringSettings connectionstring = new ConnectionStringSettings("insuranceConnectionString", dataSource);
config.ConnectionStrings.ConnectionStrings.Add(con nectionstring);
config.Save(ConfigurationSaveMode.Modified, true);
ConfigurationManager.RefreshSection("insuranceConnectionStrings");
Properties.Settings.Default.Reload();
cryptography.ProtectConnectionString();
}
کد موجود در کلاس cryptography.cs
public static void ProtectConnectionString()
{
ToggleConnectionStringProtection(Application.Execu tablePath, true);
}
public static void UnprotectConnectionString()
{
ToggleConnectionStringProtection(Application.Execu tablePath, false);
}
private static void ToggleConnectionStringProtection(string pathName, bool protect)
{
string strProvider = "DataProtectionConfigurationProvider";
Configuration oConfiguration = null;
ConnectionStringsSection oSection = null;
try
{
oConfiguration = ConfigurationManager.OpenExeConfiguration(pathName );
if (oConfiguration != null)
{
bool blnChanged = false;
oSection = oConfiguration.GetSection("connectionStrings") as ConnectionStringsSection;
if (oSection != null)
{
if ((!(oSection.ElementInformation.IsLocked)) &&
(!(oSection.SectionInformation.IsLocked)))
{
if (protect)
{
if (!(oSection.SectionInformation.IsProtected))
{
blnChanged = true;
oSection.SectionInformation.ProtectSection(strProv ider);
}
}
else
{
if (oSection.SectionInformation.IsProtected)
{
blnChanged = true;
oSection.SectionInformation.UnprotectSection();
}
}
}
if (blnChanged)
{
oSection.SectionInformation.ForceSave = true;
oConfiguration.Save();
}
}
}
}
catch (System.Exception ex)
{ throw (ex); }
}
ممنون از راهنمایی تون.