2012-07-24 161 views
31

我在加密app.config中的連接字符串時遇到問題。我有保護app.config的connectionStrings部分的代碼,但密碼仍以純文本顯示。在app.config中加密連接字符串

我需要加密連接字符串,因此它在部署時不是純文本。我在web.config上看到類似的問題,但不是app.config。

+0

請記住,如果你使用ProtectSection()和加密您的ConnectionString,我簡直可以複製你的加密config文件,用我的應用程序中使用它,並調用UnprotectSection()。這會以純文本的形式讓我回到原始連接字符串。 – 2017-12-22 14:50:47

回答

19

看看This Article它有一些非常有用的例子。你基本上在尋找System.Configuration.SectionInformation.ProtectSection來幫助你。

還可以在Implementing Protected Configuration

+2

這種方法可用於DataSet和TableAdapters嗎?他們選擇存儲在你的app.config中的ConnectingStrings ..如果它的Encrypted將會自動解密? – 2012-10-07 10:54:30

-1

偷看你可以使用Rijndael算法,在System.Security.Cryptography.Rijndael類中實現。這是非常強大的加密模式,根據特定的密碼將字節轉換爲其他字節。

看看this example

+6

你如何保護密碼? – Dan 2013-12-19 19:37:58

35

您可以輕鬆應用與web.config相同的解決方案,只需將app.config重命名爲web.config,使用aspnet_regiis工具進行加密,然後將其重命名爲app.config。

  1. 重命名的app.config到WEB.CONFIG
  2. 打開命令提示和類型:
    %windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pef "connectionStrings" c:\<folder containing your web.config> (停止在文件夾含量,並且不把結尾的 「\」)
  3. 重命名的web.config回到app.config

你可以在記事本中打開它來查看加密文件。在視覺工作室你會看到它被解密。您可以像使用未加密的方式一樣使用連接字符串。

+4

完美!正確的點! 和解密: %windir%\ Microsoft.NET \ Framework \ v2.0.50727 \ aspnet_regiis -pdf「connectionStrings」c:\文件夾 – Alex 2016-05-19 19:46:39

+4

這對我很有用,比接受的答案更容易實現。 – mgnoonan 2016-06-28 15:06:55

+0

短而乾淨的指令!謝謝!!!! – 2017-06-19 02:13:53

-4

該代碼對Model First有用。 1 - 創建一個這樣的類。 (AADOEEntities1是實體模型)

class DataContext 
{ 
    public static AADOEEntities1 Context; 
} 

2 - 把這個代碼在Program.cs中

using System; 
using System.Collections.Generic; 
using System.Collections; 
using System.Linq; 
using System.Data.Common; 
using System.Data; 
using System.Data.SqlClient; 
using System.Data.EntityClient; 
using System.Data.Metadata.Edm; 
using System.IO; 
namespace a 
     { 
     string providerName = "System.Data.SqlClient"; 
     string serverName = "."; 
     string databaseName = "AADOE"; 

     // Initialize the connection string builder for the 
     // underlying provider. 
     SqlConnectionStringBuilder sqlBuilder = 
      new SqlConnectionStringBuilder(); 

     // Set the properties for the data source. 
     sqlBuilder.DataSource = serverName; 
     sqlBuilder.InitialCatalog = databaseName; 
     sqlBuilder.IntegratedSecurity = true; 
     sqlBuilder.UserID = "sa"; 
     sqlBuilder.Password = "123456"; 

     // Build the SqlConnection connection string. 
     string providerString = sqlBuilder.ToString(); 

     // Initialize the EntityConnectionStringBuilder. 
     EntityConnectionStringBuilder entityBuilder = 
      new EntityConnectionStringBuilder(); 

     //Set the provider name. 
     entityBuilder.Provider = providerName; 

     // Set the provider-specific connection string. 
     entityBuilder.ProviderConnectionString = providerString; 

     // Set the Metadata location. 
     entityBuilder.Metadata = @"res://*/mdlAADOE.csdl| 
         res://*/mdlAADOE.ssdl| 
         res://*/mdlAADOE.msl"; 

     EntityConnection conn = 
      new EntityConnection(entityBuilder.ToString()); 

     DataContext.Context = new AADOEEntities1(conn); 

     Application.Run(new frmLogin()); 
} 

3 - 設置的ConnectionString = 「」 中的app.config。

+0

這看起來很糟糕的解決方法。例如,你可以使用反射器或類似的從二進制獲得源代碼 - >你會看到憑據 – zozzancs 2018-01-09 08:54:36

1

如果要加密connectionStrings

config.ConnectionStrings.SectionInformation.ProtectSection(Nothing); 

如果要加密AppSettings

你必須瞭解應用程序配置部分

這樣的定義config文件

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 

的位置

config.AppSettings.SectionInformation.ProtectSection(Nothing); 

enter image description here

+0

這可以工作,但在我的情況下,我不得不將「Nothing」替換爲「DataProtectionConfigurationProvider」 – 2017-09-27 20:53:20